在WPF中,我有一个只有get{}的属性。该值来自于方法的返回值。通常在属性set{}中使用NotifyPropertyChanged来通知UI并显示更新后的值。但是对于只有get{}的属性,由于必须执行方法来检查新值或不同值的情况,因此无法检测到是否有可用的新值。
有没有一种更新UI的方式,而不必保留包含方法最后一次返回值的本地变量,这样就需要进行比较?
有没有一种更新UI的方式,而不必保留包含方法最后一次返回值的本地变量,这样就需要进行比较?
NotifyPropertyChanged
并提供属性的名称,这将反过来导致WPF重新获取该值并更新用户界面。针对评论的编辑:
听起来这可能是对模型类执行某些操作的结果。在这种情况下,通常您知道一个或多个属性可能会更改,但不一定知道哪些属性会发生更改。如果您的模型实现了INotifyPropertyChanged
,则可以通过订阅该事件并通过您的NotifyPropertyChanged
方法向UI“冒泡”通知。但是,如果没有实现INotifyPropertyChanged
,还有另一种选择。
如果您知道一个或多个属性可能会更改,则可以使用string.Empty
作为EventArgs中的PropertyName
引发一个PropertyChanged
事件。这将导致所有绑定的属性都得到WPF的刷新。这很可能只是在代码中添加像这样的内容:
this.Model.DoSomething(); // This will change 1+ properties
this.NotifyPropertyChanged(string.Empty); // Refresh our entire UI
然而我不建议在所有情况下都这样做,因为它会增加开销,但如果你不知道执行操作时哪些属性会发生变化,这通常是最干净的解决方案。
是的。当您更改源数据时,需要在属性上触发INotify。以下是一个示例。
private int _myvalue = 3;
public bool MyProperty
{
get { return IsAProperty(); }
}
public bool IsAProperty()
{
return _myvalue + 1 == 4;
}
public void SetValue(int value)
{
_myvalue = value;
NotifyPropertyChanged(MyProperty);
}
NotifityPropertyChanged
需要 string
参数。很奇怪这个答案被投票赞同,而它是错误和混乱的(从 setter 调用 IsAProperty()
方法的目的是什么?)。 - Sinatr
PropertyChanged
以刷新所有订阅者。 - Fredrik Hedblad