Matt Hamilton 告诉我一个关于 WPF 的有趣事实:在 4.5 版本中可以使用静态变量以双向模式绑定。不幸的是,V4.5 仍然是测试版,我决定更改我的代码以使我的应用程序最终运行正确。
但是 - 我仍然有类似的问题,我们开始吧:
我有一个非常简单的类“RecallConnectionSettings”。这个类的成员应该可以从代码中的任何地方访问,所以我决定将它们设为静态(像这样):
public class RecallConnectionSettings
{
private static string Server {get;set;}
}
如您所见:只有一个变量“服务器”。现在我想要的是从 TextBox 文本属性到该“服务器”值的 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>
...
此时无需继续尝试,因为要这样做,默认构造函数必须是公共的。
不管我在做什么:它不起作用。在我看来,我仍然不明白它是如何工作的 - 你会这么好心并告诉我诀窍吗?