如何使用WPF MVVM验证所有字段?

时间:2015-05-13 11:04:14

标签: c# wpf validation mvvm

如果单击“创建”按钮,它将检查所有字段是否为空并验证与否。如果缺少任何内容,则会显示验证消息。

查看:

<ControlTemplate x:Key="validationErrorTemplate">
    <ControlTemplate.Resources>
        <Style x:Key="textblockErrorTooltip" TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Foreground" Value="White" />
            <Setter Property="Margin" Value="10 0 10 0" />
        </Style>
    </ControlTemplate.Resources>
    <DockPanel>
        <Border Height="Auto"
            Margin="5,0,0,0"
            Background="#DC000C"
            CornerRadius="3"
            DockPanel.Dock="right">
            <TextBlock Style="{StaticResource textblockErrorTooltip}" DockPanel.Dock="Top"
                       Text="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
        </Border>
        <AdornedElementPlaceholder Name="customAdorner">
            <Border BorderBrush="#DC000C" BorderThickness="1.3" />
        </AdornedElementPlaceholder>
    </DockPanel>
</ControlTemplate>     

<TextBlock FontSize="20" Text="UserName"  Name="txtuserName" HorizontalAlignment="Left" VerticalAlignment="Top" Height="30" Width="163" Canvas.Left="426" Canvas.Top="172"/>
<TextBox MaxLength="10" Name="txtUserName" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}" Text="{Binding MemberModelObj.MemberName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" FontSize="18"  Style="{StaticResource textblockErrorTooltip}" GotFocus="TextUserName_GotFocus" Background="Transparent" BorderThickness="0" HorizontalAlignment="Left" VerticalAlignment="Center" Height="24" Width="370" ></TextBox>
<TextBlock FontSize="20" Text="FullName" HorizontalAlignment="Left" VerticalAlignment="Top" Height="30" Width="102" Canvas.Left="426" Canvas.Top="241" RenderTransformOrigin="-1.275,0.967"/>
<TextBox FontSize="18" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}" GotFocus="TextFull_GotFocus"  Background="Transparent" BorderThickness="0" Text="{Binding MemberModelObj.MemberFullName,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" HorizontalAlignment="Left" VerticalAlignment="Center" Height="24" Width="367" Name="txtFirstName" />

我在Model Class中使用IDataErrorInfo接口。

型号:

public string this[string columnName]
{
    set { columnName = value; }
    get
    {
        switch (columnName)
        {
            case "MemberName":
                if (String.IsNullOrEmpty(MemberName))
                {
                    result = "! Please Enter a User Name";
                }
                else if (MemberName.Length >= 30)
                {
                    result = "! Name can not be longer than 30 characters.";
                }
                break;
        }
        return result;
    }
}

仅在按钮点击之前验证。但是我在按钮命令或点击事件之后将其除外。

1 个答案:

答案 0 :(得分:1)

您可以将需要验证的属性设置为默认值,例如AddNewMember()方法中的空字符串。这将触发验证。或者在对象上创建一个实现Validate()接口的公共IDataErrorInfo方法,该方法将验证所有内容。因此,当您创建新成员时,请在构造之后调用Validate()方法。