2013-08-22 34 views
2

我想实现静态类实例中绑定到财产

我有一个WPF应用程序(它只是用于测试),我想一个标签的文本(内容)的绑定财产某处。这个想法是,当用户选择不同的语言时,这个属性值将被改变。当属性发生变化时,我想用新值更新标签文本。

我已经试过

我试图创建一个静态类,静态属性的标签值。例如:

public static class Language 
{ 
    public static string Name = "Name"; 
} 

然后我能够使用XAML这个值来我的标签绑定像这样:

Content="{Binding Source={x:Static lang:Language.Name}}" 

这工作得很好的显示“姓名”的初始值。问题是,当Name属性更改时,标签值不会更改。

所以,回到制图板(谷歌)。然后我发现this answer听起来完全像我所需要的。因此,这里是我在这个新的尝试:

public class Language 
{ 
    public static Language Instance { get; private set; } 
    static Language() { Instance = new Language(); } 
    private Language() { } 

    private string name = "Name"; 
    public string Name { get { return name; } set { name = value; } } 
} 

与我结合改成了这样:

Content="{Binding Source={x:Static lang:Language.Instance}, Path=Name}" 

这仍然导致了同样的问题。

问题

缺少什么我在这里?如何在更改值时更新标签?

+1

绑定引擎的工作原理与性能。所有代码示例都包含*一个字段*名称,而不是*属性*。 – Dennis

回答

3

这根本不是一个属性。尝试:

public class Language 
{ 
    public static Language Instance { get; private set; } 
    static Language() { Instance = new Language(); } 
    private Language() { Name = "Name"; } 

    public string Name {get;private set;} 
} 

或变更通知:

public class Language : INotifyPropertyChanged 
{ 
    public static Language Instance { get; private set; } 
    static Language() { Instance = new Language(); } 
    private Language() { } 

    private string name = "Name"; 
    public string Name 
    { 
     get { return name; } 
     set { SetValue(ref name, value);} 
    } 
    protected void SetValue<T>(ref T field, T value, 
     [CallerMemberName]string propertyName=null) 
    { 
     if (!EqualityComparer<T>.Default.Equals(field, value)) 
     { 
      field = value; 
      OnPropertyChanged(propertyName); 
     } 
    } 
    protected virtual void OnPropertyChanged(
     [CallerMemberName]string propertyName=null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

好吧,我刚刚尝试过这样做,只是做了......名字{get; set;}'这个预期仍然是空白的,但是当我通过“更改语言”选项设置它时,我期待它改变。通过给它一个默认值进行测试(正如你刚才所建议的那样)确实起作用,但我仍然遇到与原始尝试一样的问题,当属性更改时如何更新标签? – musefan

+0

@musefan要做* *你需要实现'INotifyPropertyChanged' –

+0

@musefan请参阅编辑INotifyPropertyChanged –