在WPF中,我有一个只有get {}的属性。该值来自方法的返回。 NotifyPropertyChanged通常在属性集{}中使用。然后它可以通知UI并显示更新的值。但仅使用get {},由于必须执行要检查的方法,因此无法检测是否有新值或不同值。
有没有办法更新UI而不必保留包含方法中最后一个值的本地值,在这种情况下需要进行比较?
答案 0 :(得分:11)
但仅使用get {},由于必须执行要检查的方法,因此无法检测是否有新值或不同值。
问题归结为:什么改变了财产?更改属性的方法应该使用属性的名称调用NotifyPropertyChanged
,这反过来会导致WPF重新获取值并更新用户界面。
WPF不关心 引发PropertyChanged
事件的位置 - 它只是监听它,并根据需要刷新绑定。
编辑以回应评论:
听起来这可能是对您的Model类执行某些操作的结果。在这种情况下,通常您知道一个或多个属性可以更改,但不一定是哪些属性。如果您的模型实现INotifyPropertyChanged
,您可以订阅该内容,并通过NotifyPropertyChanged
方法将通知“冒泡”到用户界面。但是,如果没有,还有另一种选择。
如果您知道某个或多个媒体资源可能会发生变化,则可以在事件名称中使用PropertyChanged
作为string.Empty
举起PropertyName
个事件。这将导致WPF刷新所有绑定属性。这可能只是在你的代码中加入这样的东西:
this.Model.DoSomething(); // This will change 1+ properties
this.NotifyPropertyChanged(string.Empty); // Refresh our entire UI
我建议不要在任何地方这样做,因为它会增加开销 - 但如果你不知道在执行操作时哪些属性会发生变化,它通常是最干净的解决方案。
答案 1 :(得分:2)
是。如果您更改源数据,则需要在属性上触发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);
}