MVVM模型中的验证

时间:2010-08-16 11:47:28

标签: c#-4.0

Hai all,          我正在使用MVVM模型做一个项目,任何人都可以通过说我如何在这个模型中验证我的字段来帮助我。验证意味着,如果用户没有添加名称(示例)的文本字段,那么消息想要使用弹出窗口或其他任何东西显示。我们通过编写一个函数来执行此操作,此函数将在保存之前调用,或者在此时如果任何Mandetory字段空闲,则会显示错误,填写那个领域只有我们可以继续。我怎么能在MVVM模型中做到这一点?

1 个答案:

答案 0 :(得分:0)

好的,我不是百分百肯定你要去哪里,但我会举个例子。不知道这对MVVM有什么用处,但我想应该这样做。

在你的模型中添加:

 public bool IsValid
    {
        get
        {
            return (GetRuleViolations().Count() == 0);
        }
    }

  public override IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (string.IsNullOrEmpty(Name))
            yield return new RuleViolation("Name can't be empty", "Name");

        else if (Name.Length >= 30)
            yield return new RuleViolation("Name can't be more then 30 letters", "Name");

        if (!string.IsNullOrEmpty(Address))
        {
            if (!Web.Contains("http"))
                yield return new RuleViolation("Address must be bla bal", "Address");
        }

        // and so on

        yield break;
    }

创建RuleViolation类:

 public class RuleViolation
{
    public string ErrorMessage { get; private set; }
    public string PropertyName { get; private set; }

    public RuleViolation(string errorMessage, string propertyName)
    {
        ErrorMessage = errorMessage;
        PropertyName = propertyName;
    }
}

现在,当您调用IsValid方法时,它将检查每个属性。如果您使用的是INotifyPropertyChanged,我会在每次更新任何经过验证的属性时添加IsValid作为属性进行更新。如果你有一个基础模型类,你可以在那里添加它并在每个派生类中定义规则:

 public bool IsValid
    {
        get
        {
            return (GetRuleViolations().Count() == 0);
        }
    }

    public abstract IEnumerable<RuleViolation> GetRuleViolations();

现在的问题是如何在UI中显示此错误。那取决于用户界面是什么。我们假设WPF应用程序。然后你需要你的模型来继承IDataErrorInfo,你可以像这样使用它:

#region IDataErrorInfo Members

    public string Error
    {
        get { return null; }
    }

    public string this[string name]
    {
        get
        {
            string result = null;

            if (this.GetRuleViolations().Where(v => v.PropertyName == name).Count() > 0)
            {
                result = this.GetRuleViolations().Where(v => v.PropertyName == name).First().ErrorMessage;
            }

            return result;
        }
    }

然后在XAML代码中:

<TextBox Style="{StaticResource ValidationTextBox}" >
                    <TextBox.Text>
                        <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
                            <Binding.ValidationRules>
                                <DataErrorValidationRule />
                            </Binding.ValidationRules>
                        </Binding>
                    </TextBox.Text>
                </TextBox>

<Style x:Key="ValidationTextBox" TargetType="TextBox" >
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
            Value="{Binding RelativeSource={RelativeSource Self}, 
                   Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

如果您使用Asp.net作为UI,那么还有一些内置方法可以在表单中显示错误。

我可以成为可能并且可能有更好的方法,但我希望这有所帮助。