如何通过readonly属性通知UI更改?

时间:2011-08-30 16:01:24

标签: c# .net wpf c#-3.0

在WPF中,我有一个只有get {}的属性。该值来自方法的返回。 NotifyPropertyChanged通常在属性集{}中使用。然后它可以通知UI并显示更新的值。但仅使用get {},由于必须执行要检查的方法,因此无法检测是否有新值或不同值。

有没有办法更新UI而不必保留包含方法中最后一个值的本地值,在这种情况下需要进行比较?

2 个答案:

答案 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);
}