这是我的情景。我有一个带有标准int属性的内部类。
public class Session : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private ushort _Level;
public ushort Level
{
get { return _Level; }
}
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
// a timer code here updates the _Level property every 60 seconds
// and calls OnPropertyChange("Level");
}
在我的UI窗口中,我有一个绑定到Session实例的标签,并显示Level值。
<TextBlock Name="LevelTextBlock" Text="{Binding SessionInstance.Level, StringFormat='0%'}" />
窗口构造函数有以下代码:
public MyWindow()
{
SessionInstance = new Session();
this.InitializeComponent();
}
public Session SessionInstance { get; set; }
但是,正如您可以猜到的,当我更新_Level的值时,UI不会更新文本块。在Session类中添加DependancyProperty是不可接受的。我可以在窗口上执行此操作,但是我仍然需要通知程序来检查返回到Session实例的值。 我想知道是否有这样做的优雅方式。我想不出任何东西,除了在窗口中运行另一个计时器来检查和刷新文本块值。 有什么想法吗?
答案 0 :(得分:4)
实施INotifyPropertyChanged。甚至还有一个tool可以自动为您的所有属性(或只有属性标记的属性,它是相当可配置的)。
如果您不需要任何其他功能(值继承,绑定来自属性等),则DependencyProperty是过度的,它最好用于控件属性,而不是模型属性。
编辑:
正确实施它看起来像这样:
private string familyName;
public string FamilyName
{
get { return familyName; }
set
{
if (value != familyName)
{
familyName = value;
OnPropertyChanged("FamilyName");
}
}
}
答案 1 :(得分:0)
您是否从属性设置器调用了OnPropertyChanged?这真的是它所属的地方。