Wpf 使用IDataErrorInfo进行验证

Wpf 使用IDataErrorInfo进行验证,wpf,binding,idataerrorinfo,Wpf,Binding,Idataerrorinfo,我正在使用IDataErrorInfo为一些值实现一些基本的逻辑验证。这似乎很有效,我正在使用contentpresenter来显示结果: <ContentPresenter Content="{ Binding ElementName =MyElement, Path=(Validation.Errors).CurrentItem}" HorizontalAlignment ="Left"> <Conten

我正在使用IDataErrorInfo为一些值实现一些基本的逻辑验证。这似乎很有效,我正在使用contentpresenter来显示结果:

<ContentPresenter Content="{ Binding ElementName =MyElement, Path=(Validation.Errors).CurrentItem}"
                              HorizontalAlignment ="Left">
     <ContentPresenter.ContentTemplate>
           <DataTemplate>
                <TextBlock Foreground ="Red" FontStyle="Italic" Text="{ Binding Path =ErrorContent}" />
           </DataTemplate>
     </ContentPresenter.ContentTemplate>
</ContentPresenter>

当出现问题时,我会收到一条漂亮的红色消息,并且该字段被正确地高亮显示。但是,当这种情况发生时,我想禁用表单的保存按钮。以下是我迄今为止所做的尝试(没有成功):


ValidConverter只是一个为null或空字符串返回true的转换器

我还尝试了触发器,如下所示(同时尝试了触发器和数据触发器):


嗯。。。我正以另一种方式来做。。。这里有一个类似的按钮,但它基于对需要验证的几个
TextBox
s和
ComboBox
的几个验证

因此,我将在默认情况下将其设置为false,当所有验证错误都为false时,将其设置为true

<Button x:Name="Btn_Insert"
        Command="{Binding Insert_Command}"
        IsDefault="True"
        >
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                   ElementName=txtbx_1}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=cmb_1}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=txtbx_2}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=txtbx_3}" Value="False"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="True"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>


还可以尝试将您的
放在

上方。问题在于默认设置:

<Style.Triggers>                
    <DataTrigger Binding ="{ Binding Path=(Validation.HasError)}" Value ="True">
        <Setter Property ="Button.IsEnabled" Value="False" />
    </ DataTrigger>
</Style.Triggers>


很好。正如@Shoe所指出的,问题中有一个输入错误,现在已经更正。

{code>{Binding Path={Validation.HasError}}
应该是
{Binding Path=(Validation.HasError)}
输入错误?是-输入错误。。。修复了现在只是要更新的答案
<Button x:Name="Btn_Insert"
        Command="{Binding Insert_Command}"
        IsDefault="True"
        >
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="IsEnabled" Value="False"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                   ElementName=txtbx_1}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=cmb_1}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=txtbx_2}" Value="False"/>
                        <Condition Binding="{Binding Path=(Validation.HasError),
                                    ElementName=txtbx_3}" Value="False"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="True"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
<Style.Triggers>                
    <DataTrigger Binding ="{ Binding Path=(Validation.HasError)}" Value ="True">
        <Setter Property ="Button.IsEnabled" Value="False" />
    </ DataTrigger>
</Style.Triggers>