C# 基于ViewModel的MVVM变更模型验证规则

C# 基于ViewModel的MVVM变更模型验证规则,c#,wpf,validation,mvvm,polymorphism,C#,Wpf,Validation,Mvvm,Polymorphism,我有一个ModelA使用ModelA中定义的验证规则实现IDataErrorInfo。My ViewModelA包含类型为ObservableCollection的ListA,并且是绑定到My ViewA的数据,用于用户与列表的添加、删除、编辑等交互 现在我想要一个ViewModelB,它将从ViewModelA中固有,并且数据绑定到同一视图ViewA,但是我想要ListA中的ModelA使用不同的验证规则 我认为我可以通过以下方式实现: A:创建从ModelA派生的新ModelB并重写 验证功

我有一个ModelA使用ModelA中定义的验证规则实现IDataErrorInfo。My ViewModelA包含类型为ObservableCollection的ListA,并且是绑定到My ViewA的数据,用于用户与列表的添加、删除、编辑等交互

现在我想要一个ViewModelB,它将从ViewModelA中固有,并且数据绑定到同一视图ViewA,但是我想要ListA中的ModelA使用不同的验证规则

我认为我可以通过以下方式实现:

A:创建从ModelA派生的新ModelB并重写 验证功能;创建类型为的新ListB 我的ViewModelB中的ObservableCollection。 但是我找不到一种方法来重用这个新列表中的ViewA,我需要创建一个 新建视图B以显示它

B:使用全局标志指示ViewModel,并更改 根据该标志的验证规则。这样我就可以用同样的方法了 ViewA链接到我的ViewModelB中的相同列表A

但我真的在寻找这样的东西:

创建从ModelA派生的新ModelB并重写 验证功能;以某种方式重新定义我的列表 在ViewModelB中进行ObservableCollection,然后重用ViewA。
有什么方法可以做到这一点吗?

您可以创建一个抽象泛型类,并从中派生ModelA和ModelB

public abstract class Model<T> : IDataErrorInfo
  {
    public ObservableCollection<T> Items;

    public virtual string Error
    {
      get { throw new NotImplementedException(); }
    }

    public virtual string this[string columnName]
    {
      get { throw new NotImplementedException(); }
    }
  }

创建某种接口怎么样

interface IModelValidiationService<TModel>
{
    IDataErrorInfo Validate(TModel model);
}

或者类似的?然后将ValidiationService注入ViewModelA,将ValidiationService注入ViewModelB。

谢谢您的回答,但我不明白您的意思,现在我的列表在ViewModel中。@Xtr看起来不错,但如果他从ViewModelB中的ViewModelA中删除,那么他可能会在基本视图模型中添加带有FirstValidiation项的model,因此这会使添加项的覆盖方法复杂化我在模型中修改验证规则没有困难,如果我想使用相同的视图,我不知道如何将其反映到我的视图中这是否意味着我在ViewModel而不是模型中定义了验证规则?@Bolu这意味着您将创建两个负责验证模型的类服务,并将适当的版本注入ViewModel。ValidiationRules将位于另一个类中-viewmodel应该只调用Validate方法或类似的smth。这听起来正是我想要的方式,但你有一个工作示例吗?非常简单的示例可以吗?@Bolu我可以写一些示例-我会在几小时内完成