C# 向视图模型列表属性添加项时,视图模型无法更改模型属性

C# 向视图模型列表属性添加项时,视图模型无法更改模型属性,c#,wpf,mvvm,reactiveui,C#,Wpf,Mvvm,Reactiveui,老问题: 我和ReactiveUI一起工作。如果我通过执行add命令在ViewModelA中将新的ViewModelB对象添加到该类型的列表中,我必须更新ModelA中的P属性。但这是一个错误。如果我删除了该属性中引发的PropertyChanged事件,则不会发生错误。但我需要它来对使用这些数据的其他视图模型中的更改做出反应。有人知道我如何解决这个问题吗?代码结构如下所示: class ModelA : INotifyPropertyChanged { DateTime P; // I

老问题:

我和ReactiveUI一起工作。如果我通过执行
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表达式,问题得以解决