MVVM中的数据验证

kat*_*e77 5 wpf mvvm mvvm-light

什么是进行数据验证的最佳方法.在视图模型中进行验证还是在模型中进行验证是一种好的做法?而且,使用MVVM在WPF中实现数字(十进制)文本框的最佳方法是什么.我正在使用MVVM Light工具包.

Dan*_*rth 6

为了能够向用户提供有意义的消息,最好将ViewModel的属性绑定到类型为string的TextBox并IDataErrorInfo在ViewModel上实现.

在我的项目中,我正在使用它.我创建了一个IValidateable实现IDataErrorInfo 的接口(请原谅名称......).我的ViewModel实现了这个接口:

public interface IValidateable : IDataErrorInfo
{
    ObservableCollection<Tuple<string, ValidationError>> InvalidProperties
    { get; }
    bool IsValid { get; }
}
Run Code Online (Sandbox Code Playgroud)

我的所有文本框都使用以下样式:

<Style TargetType="{x:Type TextBox}">
    <Style.Triggers>
      <Trigger Property="Validation.HasError"
               Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" />
      </Trigger>
    </Style.Triggers>
    <Setter Property="Validation.ErrorTemplate">
      <Setter.Value>
        <ControlTemplate>
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="90*" />
              <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border BorderBrush="Red"
                    BorderThickness="1"
                    CornerRadius="2.75"
                    Grid.Column="0">
              <AdornedElementPlaceholder Grid.Column="0" />
            </Border>
            <TextBlock Foreground="Red"
                       Grid.Column="1"
                       Margin="0"
                       FontSize="12"
                       VerticalAlignment="Center"
                       HorizontalAlignment="Left">
              *
            </TextBlock>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
Run Code Online (Sandbox Code Playgroud)

如果输入的值不符合我的规则,这将显示工具提示.

此外,我创建了一个小型验证引擎,它允许为视图模型的属性分配规则,以及在设置新值时自动验证属性值的基类.
接口成员IValidateable用于在用户尝试保存无效对象时向用户显示有意义的错误消息.