PropertyChangedEventHandler for static variable not changed

时间:2015-07-13 09:36:40

标签: wpf binding inotifypropertychanged

我想知道如何使用UI属性更新static。 我的模型中有2个属性,其中一个是static

public class Machine : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public static event PropertyChangedEventHandler StaticPropertyChanged;
    public string _name;
    public static int _counter;

    public void AddMachine(Machine machine)
    {
        _counter++;
    }

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            NotifyPropertyChange("Name");
        }
    }

    public static int Counter
    {
        get { return _counter; }
        set
        {
            _counter = value;
            OnStaticlPropertyChanged("Counter");
        }
    }

    public virtual void NotifyPropertyChange(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public static void OnStaticlPropertyChanged(string propertyName)
    {
        var handler = StaticPropertyChanged;
        if (handler != null)
            StaticPropertyChanged(
                typeof(Machine),
                new PropertyChangedEventArgs(propertyName));
    }
}

如您所见,我为PropertyChangedEventHandler值创建了另一个static。 另一个属性(不是静态的 - 名称)工作正常。 我把我的对象藏在收藏中:

public ObservableCollection<Machine> machines { get; set; }

我可以看到Counter正在更改但未更新我的UI,这就是我尝试使用UI更新TextBlock的方式:

<TextBlock Name="tbStatusBar" Text="{Binding Source={x:Static my:Machine.Counter}}" />

所以我的问题是我做错了什么?

1 个答案:

答案 0 :(得分:1)

首先,您必须确保使用WPF 4.5,因为StaticPropertyChanged事件机制不适用于旧版本。

然后,在AddMachine中,您应该更新属性,而不是其后备字段:

public void AddMachine(Machine machine)
{
    Counter++;
}

最后,您必须将绑定表达式从静态源更改为静态属性的路径(请注意括号):

<TextBlock Text="{Binding Path=(my:Machine.Counter)}" />