kat*_*e77 5 wpf mvvm mvvm-light
什么是进行数据验证的最佳方法.在视图模型中进行验证还是在模型中进行验证是一种好的做法?而且,使用MVVM在WPF中实现数字(十进制)文本框的最佳方法是什么.我正在使用MVVM Light工具包.
为了能够向用户提供有意义的消息,最好将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
用于在用户尝试保存无效对象时向用户显示有意义的错误消息.