Matt Hamilton は、WPF に関する興味深い事実を教えてくれました。バージョン 4.5 では、静的変数を使用した双方向モードでのバインディングが可能です。残念ながら、V4.5 はまだベータ版なので、コードを変更してアプリを最終的に正しく実行することにしました。
しかし、まだ同様の問題があります。
非常に単純なクラス「RecallConnectionSettings」があります。このクラスのこのメンバーは、コード内のどこからでもアクセスできる必要があるため、(次のように) 静的にすることにしました。
public class RecallConnectionSettings
{
private static string Server {get;set;}
}
ご覧のとおり、変数「サーバー」は 1 つだけです。今私が欲しいのは、TextBox Text-property からその 'Server' 値への 2WayMode バインディングを作成することです。
だから私はこれを試しました:
<UserControl....>
<UserControl.Resources>
<local:RecallConnectionSettings x:Key="recallConf"/>
</UserControl.Resources>
<TextBox Text="{Binding Source={StaticResource recallConf}, Path=Server,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ... Name="txtServerAdress" />
</UserControl>
これは、テキストボックスの値を変更するとうまく機能しますが、反対側からは機能しません。「サーバー」の値を (手動で) 変更すると、テキスト ボックスのテキスト プロパティが更新されません。
もちろん、そうではありません。RecallConnectionSettings クラスに INotifyProperty を実装する必要があることはわかっています。次に、次のようになります。
public class RecallConnectionSettings : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private static string s_server;
public static string Server
{
get { return s_server; }
set
{
s_server = value;
OnPropertyChanged("Server");
}
}
public static event PropertyChangedEventHandler PropertyChanged;
protected static void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
まあ-これもうまくいきません。静的メソッドしかないため、クラス インスタンスを使用してイベントを呼び出すことはできません。
PropertyChanged(this, new PropertyChangedEventArgs(name));
それで - 今何をすべきですか?シングルトンを使用することを考えたので、これを行いました:
public class RecallConnectionSettings : INotifyPropertyChanged
{
private static RecallConnectionSettings instance;
private RecallConnectionSettings(){}
public static RecallConnectionSettings Instance
{
get
{
if(instance == null)
{
instance = new RecallConnectionSettings();
}
return instance;
}
}
// ... here comes the other stuff
}
それを機能させるには、UserControl も準備する必要があるため、次のようにしました。
...
<UserControl.DataContext>
<local:RecallConnectionSettings/>
</UserControl.DataContext>
...
この時点では、試行を続ける必要はありません。これを行うには、既定のコンストラクターを public にする必要があるためです。
私が何をしていても、うまくいきません。私はまだそれがどのように機能するのか理解していないようです - 親切にトリックを教えてくれませんか?