老问题:
我使用ReactiveUI。如果我在ViewModelB
ViewModelA
执行Add
命令时将新P
对象添加到此类型的列表中,则必须更新ModelA
中的PropertyChanged
属性。但这会引发错误。如果我删除了在此属性中抛出ViewModelA.UpdateModelValue
事件,则不会发生错误。但我需要它来使用这些数据对其他视图模型中的更改作出反应。有谁知道我怎么能解决这个问题?代码结构如下:
现在我收到了以下信息:
如果我从ViewModelBase.UpdateViewModelValues
删除Model.PropertyChanged
或Model.PropertyChanged
,则可以正常使用。只要两个都添加到事件中,我就会在ReactiveUI库中出现错误。只有这两个属性都添加到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 */
}
}
。
所以代码结构改为:
{{1}}
答案 0 :(得分:0)
我在代码中找到了First
LINQ表达式的用法。在某些情况下,没有项目可以满足相应的条件。所以我出现了一个InvalidOperationException。通过使用FirstOrDefault
LINQ表达式,问题得以解决。