将按钮datacontext设置为多个元素

时间:2010-03-11 01:05:28

标签: wpf binding triggers styles

我有一个按钮,当我的窗口出现验证错误时,我需要将其禁用。可能发生这些错误的项目都是文本框。

我已将Button的datacontext绑定为:

DataContext="{Binding ElementName=txtEmail}"

现在有了这个,我可以在电子邮件文本框中发生验证错误时将按钮样式设置为禁用,但我想在窗口中的其他文本框中出现时也这样做吗?

如何将此绑定设置为多个文本框?

2 个答案:

答案 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的一部分。然后,您可以控制命令实现的功能以及是否启用它。那么测试就容易多了。