可以在WPF中进行验证时禁用保存按钮的样式为通用

时间:2017-01-31 10:45:47

标签: wpf validation xaml datatrigger

我正在开发一个WPF应用程序,我正在使用IDataErrorInfo和验证规则进行验证。 为了在运行时仍然存在数据错误时禁用保存按钮,我创建了一个样式:

    <!--Disabling the Save-button by style not viewmodel-property-->
    <Style x:Key="isEnabled_save_button" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=tbx_firstname, Path=(Validation.HasError)}" Value="true">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding ElementName=tbx_lastname, Path=(Validation.HasError)}" Value="true">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding ElementName=tbx_age, Path=(Validation.HasError)}" Value="true">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

这很好用,但它有点复杂,因为我必须检查每个要验证的控件。 所以我试着写一个通用的数据触发器:

    <!--Disabling the Save-button by style not viewmodel-property-->
    <Style x:Key="isEnabled_save_button" TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource AncestorType=Window}}" Value="True">
                <Setter Property="IsEnabled" Value="False"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

但这不起作用。 我怎样才能使它成为通用的?

1 个答案:

答案 0 :(得分:2)

为绑定到源属性的每个元素单独设置Validation.HasError附加属性,因此无法以Button的样式进行某些“泛型”绑定。

您应该做的是将Button的IsEnabled属性绑定到视图模型的属性。它是视图模型 - 实际实现IDataErrorInfo接口的类 - 应根据验证逻辑决定是否应该启用该按钮。

<Button IsEnabled="{Binding IsEnabled}" />

如果实现.NET Framework 4.5中引入的INotifyDataErrorInfo接口,则只需绑定到HasErrors属性:

<Style TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding HasErrors}" Value="True">
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>
    </Style.Triggers>
</Style>

有更多信息以及如何在此处实现此界面的示例:https://social.technet.microsoft.com/wiki/contents/articles/19490.wpf-4-5-validating-data-in-using-the-inotifydataerrorinfo-interface.aspx

如果您仍然使用.NET 4或/并选择实现旧的IDataErrorInfo接口,您仍然可以根据验证逻辑将HasErrors属性添加到您设置为true / false的视图模型中。将source属性设置为新值时,不要忘记引发PropertyChanged接口。