我已經看到應用程序無處不在實現此接口。在很多情況下,我們可以使用新的屬性語法,如什麼時候需要實現INotifyPropertyChanged?
public int Foo { get; set; }
我非常喜歡。但是,爲了實現這個接口,這個接口必須變成10行左右。這使代碼非常混亂,我不確定它是否也會傷害性能。
有人可以解釋什麼時候這個接口真的有必要嗎?
我已經看到應用程序無處不在實現此接口。在很多情況下,我們可以使用新的屬性語法,如什麼時候需要實現INotifyPropertyChanged?
public int Foo { get; set; }
我非常喜歡。但是,爲了實現這個接口,這個接口必須變成10行左右。這使代碼非常混亂,我不確定它是否也會傷害性能。
有人可以解釋什麼時候這個接口真的有必要嗎?
如果您想訂閱屬性已更改的通知,則必須執行此操作。如果你不需要(也沒有第三方庫需要),你不必實現這個接口。
當數據對象需要通告(通知)屬性已更改時,您可以實現該接口。這在使用數據綁定時尤爲重要,在使用Observer模式時非常有用。
Check here對於我有一個方法時,我有很多需要通知變化的屬性。
在期望它的框架內使用庫或其他功能時,此接口是必需的。
最常見的是使用像WPF一樣的UI框架和數據綁定。爲了使UI知道你的屬性已經改變了,所以它可以反映TextBox的內容,例如,它的邊界所需的對象或者是DependencyObject,並且該屬性需要是DependencyProperty,或者你需要實現INotifyPropertyChanged。
這就是使雙向數據綁定正常工作的原因。
這就是說,通常在基類上實現它,這可以使您的子類實現只有每個屬性幾行。 (你不能使用自動屬性,但是如果你使用基類,你可能只需要一些額外的行。)
另一種方法是使用微軟的ReactiveExtensions(Rx)框架來包裝所有管道工作成單個可觀測物體。
有關如何執行此操作的示例,請參閱this StackOverflow question and answers。
那樣做
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;
}
}
它提煉出來的上述回答,真的幫助了我。
它用於數據綁定屬性通知 – 2010-10-05 00:48:27