在 WPF 中验证时禁用保存按钮的样式是否可以通用

Can style for disabling save-button while validation in WPF be made generic

我正在开发一个 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>

但这行不通。 我怎样才能使它通用?

附加的 Validation.HasError 属性 为绑定到源 属性 的每个元素单独设置,因此无法在按钮的样式。

您应该做的是将 Button 的 IsEnabled 属性 绑定到视图模型的 属性。它是视图模型 - class 实际上实现了 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 or/and 选择实现旧的 IDataErrorInfo 接口,您仍然可以将 HasErrors 属性 添加到您设置为 true/false 根据您的验证逻辑。将源 属性 设置为新值时,不要忘记引发 PropertyChanged 接口。