我遇到了一個問題,我在DataModel
和ViewModel
與PropertyChanged event
之間無限循環。如何爲INotifyPropertyChanged接口創建自己的PropertyChangedEventArgs?
我的結構:
public class SomeDataModel : DataModelBase
{
public SomeDataModel()
{
}
public object SomeProperty
{
get
{
//
}
set;
{
//
OnPropertyChanged("SomeProperty");
}
}
public bool SomeMethod()
{
SomeProperty = SomeNewObject
}
}
public class SomeViewModel : ViewModelBase
{
public SomeViewModel()
{
}
public SomeDataModel SomeDataModel
{
get;
set;
}
public object SomeProperty
{
get
{
return SomeDataModel.SomeProperty;
}
set
{
SomeDataModel.SomeProperty = value;
OnPropertyChanged("SomeProperty");
}
}
}
兩個ViewModel
和DataModel
實現INotifyPropertyChanged
。
然後我在我的ViewModelBase
一個listener
的,在我的DataModel
改變任何property
:
private void DataModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
PropertyInfo toPropertyInfo = this.GetType().GetProperty(e.PropertyName);
PropertyInfo fromPropertyInfo = DataModel.GetType().GetProperty(e.PropertyName);
if (toPropertyInfo != null && fromPropertyInfo != null)
{
if (toPropertyInfo.CanWrite && fromPropertyInfo.CanRead)
{
toPropertyInfo.SetValue(this, fromPropertyInfo.GetValue(DataModel, null), null);
}
}
}
當property
被設定所以現在在DataModel
,聽者ViewModelBase
漁獲物,並更新相關property
在ViewModel
。但ViewModel
中的設置將其重新設置爲DataModel
,原因OnPropertyChanged("SomeProperty");
會觸發agian,並以無限循環結束。
- 是否有快速解決問題的方法? (注意:無法更改結構)
- 我能夠創建自己的自定義類,從
PropertyChangedEventArgs
繼承,並仍然有我的INotifyPropertyChanged
操作工作?
我在想:
public class CustomPropertyChangedEventArgs : PropertyChangedEventArgs
{
public CustomPropertyChangedEventArgs(string propertyName, SomeEnum enumName)
: base(propertyName)
{
//Set enum
}
}
,然後在OnPropertyChanged
我想使用新的CustomPropertyChangedEventArgs
並傳入我想使用enum
。
public void OnPropertyChanged(string propertyName)
{
CustomPropertyChangedEventArgs handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new CustomPropertyChangedEventArgs(propertyName, newEnum));
}
}
我可能會得到抨擊,但我把在每個對象(檢查並添加進入的方法,並刪除在退出方法)目前正在發生變化的所有屬性名的一流水平列表。如果當我輸入OnPropertyChanged時,屬性名稱已經在列表中,我只是返回而不做任何事情。我寧願不刷新,也不願冒着無限循環的風險。 – Belmiris 2012-08-16 15:49:51
是的,我會在代碼審查中爆炸你。 :) – tsells 2012-08-16 16:37:50
只要您確定沒有人會調用OnPropertyChanged但屬性集代碼,Amiram Korach就有最好的方法。否則將永遠存在無限循環的風險。我會對憤怒的用戶和崩潰的程序進行差評=) – Belmiris 2012-08-16 16:47:32