3

我想要达到的目标

我有一个 WPF 应用程序(它只是用于测试),我想将标签的文本(内容)绑定到某个地方的属性。这个想法是当用户选择不同的语言时,这个属性值将会改变。当属性更改时,我希望标签文本使用新值进行更新。

我试过的

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

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

然后我可以使用 XAML 将此值绑定到我的标签,如下所示:

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

这可以很好地显示“名称”的初始值。问题是,当Name属性更改时,标签值不会更改。

所以,回到绘图板(谷歌)。然后我发现这个答案听起来和我需要的完全一样。所以这是我的新尝试:

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}"

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

问题

我在这里想念什么?当值更改时,如何让标签更新?

4

1 回答 1

4

那根本不是财产。尝试:

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;
}
于 2013-08-22T10:23:16.153 回答