我想知道如何使用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}}" />
所以我的问题是我做错了什么?
答案 0 :(得分:1)
首先,您必须确保使用WPF 4.5,因为StaticPropertyChanged
事件机制不适用于旧版本。
然后,在AddMachine
中,您应该更新属性,而不是其后备字段:
public void AddMachine(Machine machine)
{
Counter++;
}
最后,您必须将绑定表达式从静态源更改为静态属性的路径(请注意括号):
<TextBlock Text="{Binding Path=(my:Machine.Counter)}" />