我正在开发一个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>
但这不起作用。 我怎样才能使它成为通用的?
答案 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接口。