我什么时候需要实现INotifyPropertyChanged?

时间:2010-10-05 00:38:27

标签: .net inotifypropertychanged

我见过各处实现此界面的应用程序。在许多情况下,我们可以使用新的属性语法,如

public int Foo { get; set; }

我非常喜欢。但是,为了实现这个接口,这个接口必须变成10行左右。这使得代码非常混乱,我不确定它是否也会损害性能。

有人可以解释这个界面真的有必要吗?

5 个答案:

答案 0 :(得分:2)

当数据对象需要通告(通知)属性已更改时,您实现该接口。这在使用数据绑定时尤为重要,在使用Observer模式时非常有用。

Check here当我有许多需要通知变更的属性时,我遵循的方法。

答案 1 :(得分:1)

如果您想订阅属性已更改的通知,则必须这样做。如果您不需要(并且不需要第三方库),则不必实现此接口。

答案 2 :(得分:0)

在框架中使用库或其他期望的功能时,此接口是必需的。

最常见的是使用像WPF这样的UI框架及其数据绑定。为了让UI“知道”您的属性已更改,因此它可以反映TextBox的内容,例如,其绑定需要的对象是DependencyObject,属性需要是DependencyProperty,或者你需要实现INotifyPropertyChanged。

这使得双向数据绑定正常工作。

话虽如此,在基类上实现这一点很常见,这可以使您的子类实现每个属性只有几行。 (您不能使用自动属性,但如果使用基类,则可能只需要在setter中添加几行。)

答案 3 :(得分:0)

一种替代方法是使用Microsoft的ReactiveExtensions(Rx)框架将所有管道工作包装到单个Observable< T>中。对象

有关如何执行此操作的示例,请参阅this StackOverflow question and answers

答案 4 :(得分:0)

这样做

public class ViewModelBase : INotifyPropertyChanged

{

protected void SetProperty<t>(ref T newValue, ref T currentValue, bool notify, string propertyName, params string[] additionalProperties)
{
    bool changed = notify && ((newValue != null && !newValue.Equals(currentValue)) || (newValue == null && currentValue != null));
    currentValue = newValue;
    if (changed)
    {
        OnPropertyChanged(propertyName);

        if (additionalProperties != null)
            foreach (string additionalProperty in additionalProperties)
                OnPropertyChanged(additionalProperty);
    }
}

protected virtual void OnPropertyChanged(string propertyName)
{
    if (this.PropertyChanged != null)
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;

}

public class MyRealViewModel : ViewModelBase

{     public int NumberOfItems     {         get {return _numItems; }         set {SetProperty(ref value,ref _numItems,true,“NumberOfItems”); }     }

public bool SomeKindOfFlag
{
    get { return _flag; }
    set { SetProperty(ref value, ref _flag, false, ""); }
}

public LightSabre WeaponOfChoice
{
    get { return _weapon; }
    set { SetProperty(ref value, ref _weapon, true, "WeaponOfChoice", "SomeKindOfFlag", "NumberOfItems"); }
}

private bool _flag;
private int _numItems;
private LightSabre _weapon;

}

public class LightSabre

{

public string LightSabreName {get;组; }

public override bool Equals(object obj)
{
    if (obj != null && obj as LightSabre != null)
        return ((LightSabre)obj).LightSabreName == this.LightSabreName;

    return false;
}

}

它是从上面的答案中提取的,真的帮助了我。