两个不同模型的共享验证逻辑

时间:2015-05-05 14:55:40

标签: c# wpf validation c#-4.0 mvvm

更新:我一直在努力寻找解决方案,而且我不太确定我们是否能够这样做。一旦我对我的想法有了更好的了解,我会立即更新问题: - )

我们当前的项目使用WPF和MVVM方法。我们的应用程序将有几个编辑器,每个编辑器都有自己的模型。

视图将如下所示:

Overview

每个编辑器都有自己的模型/视图模型/模型。父视图(包含所有子编辑器)模型包含可以从中提供所有子编辑器的数据。

由于用户应该能够随时保存其当前状态,我们还需要能够验证现有数据(因为用户可能输入了无效数据)。所以我们需要在两个地方进行验证:

  • 当用户输入数据时
  • 在启动应用程序后再次加载数据时

由于我们不想将数据转换为每个子编辑器模型只是为了获得验证结果,因此父模型也应该能够被验证。

我发现实现这一目标的唯一方法是引入接口,这些接口基本上描述了要验证的类中数据的结构。它可能看起来像这样:

interface IValidateModel
{
  string foo;
}

class Editor1Model : IValidateModel
{
  string foo;
  int someOtherProperty;
}

class Editor2Model: IValidateModel
{
  string foo;
  byte fooBar;      
}

class ParentModel
{
  Sub subProp;
  // some other parent model properties
}

一旦不利,现在数据的结构方式由界面定义。

有没有人对这个问题有一些经验,或者甚至有更好的解决方案呢?

1 个答案:

答案 0 :(得分:0)

如果要验证用户的输入,则应在绑定上使用ValidationRules

您可以通过继承ValidationRule并覆盖Validate()

来定义它们
public class TestRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string test = value as string;

        if (text == null)
        {
            return new ValidationResult(false, "only strings are allowed");
        }
        else
        {
            return new ValidationResult(true, null);
        }
    }
}

在XAML中,您可以指定验证规则的命名空间:

<Window xmlns:vr="clr-namespace:MyApp.ValidationRules"></Window>

然后你可以在像这样的绑定上使用它:

<TextBox>
    <TextBox.Text>
        <Binding Path="MyPath">
            <Binding.ValidationRules>
                <vr:TestRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>