我遇到了一个问题,在我的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");
}
}
}ViewModel和DataModel都实现了INotifyPropertyChanged。
然后,我的ViewModelBase中有一个ViewModelBase,用于任何在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中的侦听器会捕获它并在ViewModel中更新相关的property。但是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));
}
}发布于 2012-08-16 15:47:09
您可以检查该值是否相同,并且不更新它。这就是通常实现INotifyPropertyChanged的方式。只有当OnPropertyChanged 真正改变了时,才会触发。
public object SomeProperty
{
get
{
return SomeDataModel.SomeProperty;
}
set
{
if (SomeDataModel.SomeProperty != value)
{
SomeDataModel.SomeProperty = value;
OnPropertyChanged("SomeProperty");
}
}
}发布于 2012-08-16 15:56:04
you can disable and enable the event to avoid loop
private void DataModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
OnPropertyChanged -= DataModel_PropertyChanged;
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);
}
}
OnPropertyChanged += DataModel_PropertyChanged;
}https://stackoverflow.com/questions/11990801
复制相似问题