Wil*_*lem 0 .net c# events class mvvm
我所遇到的一个问题,我在我之间的无限循环获取DataModel和ViewModel使用PropertyChanged event.
我的结构:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
两者ViewModel和DataModel实现INotifyPropertyChanged.
然后我listener在我ViewModelBase的任何property改变我的DataModel:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,现在当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
}
}
Run Code Online (Sandbox Code Playgroud)
然后在OnPropertyChanged我想要使用新的CustomPropertyChangedEventArgs并传递enum我想要使用的内容.
public void OnPropertyChanged(string propertyName)
{
CustomPropertyChangedEventArgs handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new CustomPropertyChangedEventArgs(propertyName, newEnum));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以检查值是否相同,不要更新它.这是通常INotifyPropertyChanged的实施方式.OnPropertyChanged如果真的发生变化,你只会发射它.
public object SomeProperty
{
get
{
return SomeDataModel.SomeProperty;
}
set
{
if (SomeDataModel.SomeProperty != value)
{
SomeDataModel.SomeProperty = value;
OnPropertyChanged("SomeProperty");
}
}
}
Run Code Online (Sandbox Code Playgroud)