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