使用IDataErrorInfo进行验证

时间:2013-11-27 11:53:18

标签: wpf binding idataerrorinfo

我正在使用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>

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

<Button Content="Save" Click ="MyButton_Click"
            IsEnabled="{Binding Converter={StaticResource ValidConverter}, ConverterParameter={Binding ElementName=MyElement, Path=(Validation.Errors).CurrentItem}}"/>

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

我也尝试了触发器,像这样(尝试了Trigger和DataTrigger):

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

我已经找到了一些关于此的在线信息,据我所知,触发方法应该有效;但是,如果我使用Trigger,则没有任何反应,并且DataTrigger无法编译(错误MC1000:未知构建错误,'索引(基于零)必须大于或等于零且小于参数列表的大小)。< / p>

有谁能告诉我为什么这不起作用,我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

嗯......我正在反过来......这是一个类似的按钮,但它基于几个需要验证的TextBoxComboBox的验证。

因此,我默认将其设置为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>

尝试将<Setter Property ="Button.IsEnabled" Value="True" />置于<Style.Triggers>

之上

答案 1 :(得分:0)

问题在于默认值:

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

工作正常。正如@Shoe指出的那样 - 问题中有一个拼写错误 - 现在已经纠正了。