2010-10-05 154 views
1

我已經看到應用程序無處不在實現此接口。在很多情況下,我們可以使用新的屬性語法,如什麼時候需要實現INotifyPropertyChanged?

public int Foo { get; set; } 

我非常喜歡。但是,爲了實現這個接口,這個接口必須變成10行左右。這使代碼非常混亂,我不確定它是否也會傷害性能。

有人可以解釋什麼時候這個接口真的有必要嗎?

回答

1

如果您想訂閱屬性已更改的通知,則必須執行此操作。如果你不需要(也沒有第三方庫需要),你不必實現這個接口。

+0

它用於數據綁定屬性通知 – 2010-10-05 00:48:27

2

當數據對象需要通告(通知)屬性已更改時,您可以實現該接口。這在使用數據綁定時尤爲重要,在使用Observer模式時非常有用。

Check here對於我有一個方法時,我有很多需要通知變化的屬性。

0

在期望它的框架內使用庫或其他功能時,此接口是必需的。

最常見的是使用像WPF一樣的UI框架和數據綁定。爲了使UI知道你的屬性已經改變了,所以它可以反映TextBox的內容,例如,它的邊界所需的對象或者是DependencyObject,並且該屬性需要是DependencyProperty,或者你需要實現INotifyPropertyChanged。

這就是使雙向數據綁定正常工作的原因。

這就是說,通常在基類上實現它,這可以使您的子類實現只有每個屬性幾行。 (你不能使用自動屬性,但是如果你使用基類,你可能只需要一些額外的行。)

0

另一種方法是使用微軟的ReactiveExtensions(Rx)框架來包裝所有管道工作成單個可觀測物體。

有關如何執行此操作的示例,請參閱this StackOverflow question and answers

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 

{ 公衆詮釋NumberOfItems { 得到{_numItems; } {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 

{

公共字符串LightSabreName {獲得;組; }

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

    return false; 
} 

}

它提煉出來的上述回答,真的幫助了我。

相關問題