c#WPF确定DataGrid默认的可视化验证是否有错误

时间:2015-09-01 15:26:22

标签: c# wpf validation xaml datagrid

我是WPF的新手,我总是使用自定义ValidationRule类对各种UI控件进行验证,但是,当第一次使用DataGrid并将其与简单的DataTable绑定时,我发现DataGrid有一个非常好的默认验证,用于检测DataTable列的类型,如果单元格值与预期类型不同,则会出现可视错误。这对我来说已经足够了,我认为不需要创建自定义验证规则,因为默认验证规则符合我的目的。但是,如果此DataGrid有任何错误,我需要禁用“提交”按钮,因此我认为使用以下代码可以轻松利用Validation.HasError属性:

<Button x:Name="btnSubmit" Content="Submit">
        <Button.Style>
            <Style TargetType="Button">
                <Setter Property="IsEnabled" Value="False"/>
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding Path=(Validation.HasError),ElementName=dataGrid}" Value="False"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="IsEnabled" Value="True"/>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

但不幸的是,无论我在运行时的datagrid单元格中输入的值如何,Validation.HasError似乎总是为False。默认的可视验证工作正常,当输入的值不正确时,单元格会出现红色边框,但是,没有通知发出来自dataGrid的错误。

有没有办法在XAML中检测dataGrid的默认可视验证是否产生错误?或者我是否必须为此目的使用自定义验证规则?

1 个答案:

答案 0 :(得分:0)

您可以在Ap.xaml文件上创建全局验证。所以你的控件将有一个红色的星号,错误信息为Tooltip。对项目的任何控制都可以使用相同的验证。

在App.xaml文件中:

 <Style x:Key="AsteriskTemplate" TargetType="Control">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel LastChildFill="True">
                        <TextBlock DockPanel.Dock="Right"
                           Foreground="Red"
                           FontSize="14pt"
                           Margin="-15,0,0,0" FontWeight="Bold">*
                        </TextBlock>                            
                        <Border>
                            <AdornedElementPlaceholder Name="myControl"/>
                        </Border>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                    Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>


 <Style TargetType="DataGrid" BasedOn="{StaticResource AsteriskTemplate}" />