C# 向视图模型列表属性添加项时,视图模型无法更改模型属性
老问题: 我和ReactiveUI一起工作。如果我通过执行C# 向视图模型列表属性添加项时,视图模型无法更改模型属性,c#,wpf,mvvm,reactiveui,C#,Wpf,Mvvm,Reactiveui,老问题: 我和ReactiveUI一起工作。如果我通过执行add命令在ViewModelA中将新的ViewModelB对象添加到该类型的列表中,我必须更新ModelA中的P属性。但这是一个错误。如果我删除了该属性中引发的PropertyChanged事件,则不会发生错误。但我需要它来对使用这些数据的其他视图模型中的更改做出反应。有人知道我如何解决这个问题吗?代码结构如下所示: class ModelA : INotifyPropertyChanged { DateTime P; // I
add
命令在ViewModelA
中将新的ViewModelB
对象添加到该类型的列表中,我必须更新ModelA
中的P
属性。但这是一个错误。如果我删除了该属性中引发的PropertyChanged
事件,则不会发生错误。但我需要它来对使用这些数据的其他视图模型中的更改做出反应。有人知道我如何解决这个问题吗?代码结构如下所示:
class ModelA : INotifyPropertyChanged
{
DateTime P; // In the original a property throwing PropertyChanged
ObservableCollection<ViewModelB> BModels; /* PropertyChanged event passed to ModelA */
}
class ViewModelA : ViewModelBase
{
IReactiveListDerived<ModelB> BViewModels;
ReactiveCommand Add;
ViewModelA(ModelA m)
{
Model=m;
Model.PropertyChanged+=UpdateModelA;
BViewModels=m.BModels.CreateDerivedList(x => ViewModelB(x));
Add=new ReactiveCommand();
Add.Subscribe(x => Model.BModels.Add(new ModelB()));
}
void UpdateModelA(object sender, PropertyChangedEventArgs e)
{
if(e.Name=="BModels")
{
Model.P=/*new value*/;
}
}
}
class ModelB : INotifyChanged
{
/* Code */
}
class ViewModelB : ViewModelBase
{
ViewModelB(ModelB m)
{
/* Code */
}
}
class ViewModelBase : ReactiveObject
{
INotifyPropertyChanged Model;
ViewModelBase()
{
Model.PropertyChanged+=UpdateViewModelValues();
}
void UpdateViewModelValues(object sender, PropertyChangedEventArgs e)
{
/* Code
Only value types are affected
Property ViewModelA.BModels is not affected */
}
}
现在我得到了以下信息:
如果我从Model.PropertyChanged
中删除ViewModelA.UpdateModelValue
或ViewModelBase.UpdateViewModelValue
,则效果良好。一旦这两个都添加到事件中,我就会在ReactiveUI库中看到错误。只有这两个属性被添加到Model.PropertyChanged
因此,代码结构更改为以下内容:
class ModelA : INotifyPropertyChanged
{
DateTime P; // In the original a property throwing PropertyChanged
ObservableCollection<ViewModelB> BModels; /* PropertyChanged event passed to ModelA */
}
class ViewModelA : ViewModelBase
{
IReactiveListDerived<ModelB> BViewModels;
ReactiveCommand Add;
ViewModelA(ModelA m)
{
Model=m;
Model.PropertyChanged+=UpdateModelA;
BViewModels=m.BModels.CreateDerivedList(x => ViewModelB(x));
Add=new ReactiveCommand();
Add.Subscribe(x => Model.BModels.Add(new ModelB()));
}
void UpdateModelA(object sender, PropertyChangedEventArgs e)
{
if(e.Name=="BModels")
{
Model.P=/*new value*/;
}
}
}
class ModelB : INotifyChanged
{
/* Code */
}
class ViewModelB : ViewModelBase
{
ViewModelB(ModelB m)
{
/* Code */
}
}
class ViewModelBase : ReactiveObject
{
INotifyPropertyChanged Model;
ViewModelBase()
{
Model.PropertyChanged+=UpdateViewModelValues();
}
void UpdateViewModelValues(object sender, PropertyChangedEventArgs e)
{
/* Code
Only value types are affected
Property ViewModelA.BModels is not affected */
}
}
class ModelA:INotifyPropertyChanged
{
DateTime P;//在原始文件中,a属性抛出PropertyChanged
ObservableCollection BModels;/*传递给ModelA的PropertyChanged事件*/
}
类ViewModelA:ViewModelBase
{
IReActiveList派生的BViewModels;
反应命令添加;
ViewModelA(ModelA m)
{
模型=m;
Model.PropertyChanged+=UpdateModelA;
BViewModels=m.BModels.CreateDerivedList(x=>ViewModelB(x));
添加=新的反应命令();
Subscribe(x=>Model.BModels.Add(newmodelb());
}
void UpdateModelA(对象发送方,PropertyChangedEventArgs e)
{
如果(e.Name==“BModels”)
{
Model.P=/*新值*/;
}
}
}
类ModelB:INotifyChanged
{
/*代码*/
}
类ViewModelB:ViewModelBase
{
ViewModelB(ModelB m)
{
/*代码*/
}
}
类ViewModelBase:ReactiveObject
{
INotifyPropertyChanged模型;
ViewModelBase()
{
Model.PropertyChanged+=UpdateViewModelValue();
}
void updateViewModelValue(对象发送方,PropertyChangedEventArgs e)
{
/*代码
仅值类型受影响
属性ViewModelA.BModels不受影响*/
}
}
我发现在我的代码中使用了First
LINQ表达式。在某些情况下,没有任何项目可以满足相应的条件。所以我顺理成章地提出了一个无效手术例外。通过使用FirstOrDefault
LINQ表达式,问题得以解决