我有一个按钮,当我的窗口出现验证错误时,我需要将其禁用。可能发生这些错误的项目都是文本框。
我已将Button的datacontext绑定为:
DataContext="{Binding ElementName=txtEmail}"
现在有了这个,我可以在电子邮件文本框中发生验证错误时将按钮样式设置为禁用,但我想在窗口中的其他文本框中出现时也这样做吗?
如何将此绑定设置为多个文本框?
答案 0 :(得分:3)
你不能,至少不能直接。您可以将MultiBinding与所有需要的文本框一起用作输入,但是您需要提供一个IMultiValueConverter来将各种文本框“组合”成一个对象(例如列表):
<Button>
<Button.DataContext>
<MultiBinding Converter="{StaticResource ListMaker}">
<Binding ElementName="txtEmail" />
<Binding ElementName="txtFirstName" />
<Binding ElementName="txtLastName" />
</MultiBinding>
</Button.DataContext>
</Button>
然后生成的列表对象将被传递给您的触发器,因此您将无法直接访问Validation.HasError属性:您的DataTrigger还需要引入一个转换列表对象的转换器到一个布尔值,指示是否为列表中的任何内容设置Validation.HasError。此时您可能只是忘记触发器并使用MultiBinding绑定IsEnabled:
<Button>
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource AllFalse}">
<Binding Path="(Validation.HasError)" ElementName="txtEmail" />
<Binding Path="(Validation.HasError)" ElementName="txtFirstName" />
<Binding Path="(Validation.HasError)" ElementName="txtLastName" />
</MultiBinding>
</Button.DataContext>
</Button>
(如果所有输入都为false,则AllFalse转换器返回true;如果任何输入为true,则返回false。)
但是,更好的方法可能是,不要将Button直接绑定到其他UI元素,而是将数据对象 - 与文本框绑定的对象相同 - 公开IsValid属性(具有适当的更改通知) ),并将Button.IsEnabled绑定到:<Button IsEnabled="{Binding IsValid}" />
这将使您转向MVVM风格的解决方案,这有助于实现可测试性(例如,很容易为IsValid属性创建测试;为Button.IsEnabled创建测试要困难得多。)
答案 1 :(得分:0)
对于MVVM方法,您可以尝试从ICommand实现命令路由器。
<Button Command="{Binding Path=Commands.MyButtonCommand}" Style="{StaticResource MyButtonStyle}" ></Button>
其中Commands属性是ViewModel的一部分。然后,您可以控制命令实现的功能以及是否启用它。那么测试就容易多了。