[英]Binding to a property within a static class instance
我正在努力实现的目标
我有一个WPF应用程序(仅用于测试),我想将标签的文本(内容)绑定到某个位置的属性。 想法是,当用户选择其他语言时,将更改此属性值。 当属性更改时,我希望标签文本以新值更新。
我尝试过的
我试图为标签值创建一个带有静态属性的静态类。 例如:
public static class Language
{
public static string Name = "Name";
}
然后,我可以使用XAML将此值绑定到标签上,如下所示:
Content="{Binding Source={x:Static lang:Language.Name}}"
这样做可以很好地显示“名称”的初始值。 问题是,当Name
属性更改时,标签值不会更改。
因此,回到绘图板(Google)。 然后我找到了这个答案 ,听起来完全符合我的需求。 因此,这是我的新尝试:
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}"
这仍然会导致相同的问题。
问题
我在这里想念什么? 值更改后如何更新标签?
那根本不是财产。 尝试:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.