【问题标题】:Validation using IDataErrorInfo使用 IDataErrorInfo 进行验证
【发布时间】:2013-11-27 11:53:17
【问题描述】:

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

我在网上找到了一些关于此的信息,据我所知,触发方法应该可以工作;但是,如果我使用触发器,则不会发生任何事情,并且 DataTrigger 不会编译(错误 MC1000:未知构建错误,'索引(基于零)必须大于或等于零且小于参数列表的大小)。

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

【问题讨论】:

  • {Binding Path={ Validation.HasError}} 应该是{ Binding Path=(Validation.HasError)} 错字?
  • 是的 - 错字...现在已修复,只是要更新答案

标签: wpf binding idataerrorinfo


【解决方案1】:

嗯...我正在反其道而行之...这里有一个类似的按钮,但它基于需要验证的几个 TextBoxs 和 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>

尝试将您的&lt;Setter Property ="Button.IsEnabled" Value="True" /&gt; 放在&lt;Style.Triggers&gt; 上方

【讨论】:

    【解决方案2】:

    问题出在默认值上:

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

    工作正常。正如@Shoe 指出的那样 - 问题中有一个错字 - 现在已更正。

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2012-11-02
      相关资源
      最近更新 更多