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

本文关键字:模型 验证 规则 ViewModel MVVM 基于 | 更新日期: 2023-09-27 18:33:54

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

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

我想我可以通过以下方式实现它:

  • 答:创建一个派生自ModelA的新ModelB并覆盖那里的验证功能;创建类型的新ListB ObservableCollection<ModelB>在我的ViewModelB.但是我找不到在此新列表中重用ViewA的方法,我需要创建一个新ViewB显示它。

  • B:使用全局标志指示视图模型,并更改根据该标志的验证规则。这样我就可以使用相同的 ViewA与我的ViewModelB中的相同ListA链接.

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

  • 创建派生自ModelA的新ModelB并覆盖那里的验证功能;以某种方式重新定义我的ListA ObservableCollection<ModelB> ViewModelB,然后重用ViewA

有什么办法可以做到这一点吗?

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

您可以创建一个抽象泛型类,并从中派生 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);
}

或类似的东西?然后,您将ValidiationServiceA注入ViewModelA并将ValidiationServiceB注入ViewModelB