Matt Hamilton告诉我一个关于
WPF的有趣事实:在版本4.5中可以使用静态变量进行双向模式绑定.
不幸的是V4.5仍然是测试版,我决定更改我的代码以使我的应用程序最终运行正确.
但是 – 我仍然有类似的问题,我们走了:
我有一个非常简单的类’RecallConnectionSettings’.这个类的成员应该可以从代码中的任何地方访问,所以我决定让它们成为静态的(像这样):
public class RecallConnectionSettings
{
private static string Server {get;set;}
}
如您所见:只有一个变量’Server’.
现在我想要的是将2WayMode从TextBox Text-property绑定到’Server’值.
所以我尝试了这个:
<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>
...
此时不需要继续尝试,因为为此,默认构造函数必须是公共的.
无论我在做什么:它都行不通.
在我看来,我仍然不明白它是如何工作的 – 你会这么善良并告诉我这个诀窍吗?
最佳答案 保留单例解决方案并替换它:
...
<UserControl>
<UserControl.DataContext>
<local:RecallConnectionSettings/>
</UserControl.DataContext>
...
</UserControl>
...
这样:
...
<UserControl DataContext="{x:Static local:RecallConnectionSettings.Instance}">
...
</UserControl>
...