初始化模型时如何跳过wpf验证?

时间:2014-10-09 20:13:28

标签: c# wpf validation xaml mvvm

我正在尝试为文本框创建wpf错误验证。看起来很简单,但经过几天尝试很多方法后,我仍然试图找出正确的方法。

这是我的代码(这不是我的真实代码,只是一个例子):

文本框

<TextBox Text="{Binding Model.Name , UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}" 
        Style="{StaticResource NameTextBoxStyle}" />

样式

<Style x:Uid="Style_81" x:Key="NameTextBoxStyle}" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
        <Trigger.Setters>
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=              (Validation.Errors)[0].ErrorContent}"/>
        </Trigger.Setters>
        </Trigger>
    </Style.Triggers>
</Style>

班级

Public Class SomeClass
{
    public bool IsNameMandatory { get; set; }

    string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (IsNameMandatory && String.IsNullOrEmpty(value))
            {
                throw new Exception("Name can not be empty.");
            }
            if (value.Length > 12)
            {
                throw new Exception("name can not be longer than 12 charectors");
            }

            name = value;
            OnPropertyChanged("Name");
        }
    }
}

问题:错误验证正在运行,但是当模型被&#34;初始化&#34;并将一个空白值设置为&#34; Name&#34;使用工具提示使用消息框而不是红色矩形引发异常。我想要在消息框中显示异常。

我的需求:我只需要在文本框的 LostFocus 按需

上验证错误

1 个答案:

答案 0 :(得分:2)

以下是使用Binding.ValidationRules Property正确完成WPF验证的方法:

在您的视图中:

xmlns:tools="clr-namespace:SomeAppNameSpace.Tools"

<TextBox Style="{StaticResource SomeStyle}">
    <TextBox.Text>
        <Binding Path="SomeProperty" UpdateSourceTrigger="LostFocus" >
            <Binding.ValidationRules>
                <tools:SomeValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

ValidationRule类位于您的工具(或等效的)命名空间中:

public class SomeValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, 
      CultureInfo cultureInfo)
    {
        var userText = value as string;
        return String.IsNullOrWhiteSpace(userText) ? 
            new ValidationResult(false, "Value must be provided.") : 
            new ValidationResult(true, null);
    }
}

因此,这个简单的ValidationRule会检查LostFocus上的文本框,如果文本框留空,则会返回验证错误消息...

最后一个难题是你的“SomeStyle”是上面文本框的样式必须定义Validation.ErrorTemplate ......这样的事情:

<Style x:Key="SomeStyle" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
  <Setter.Value>
    <ControlTemplate >
      <!-- Your Error Template here. Typically a border with 
           red background and a textbox with light colored text...  -->
    </ControlTemplate>
  </Setter.Value>
</Setter>
</Style>