我有一个带有多个按钮的界面。我想根据“复杂”条件启用或禁用这些按钮。我将此MultiBinding声明为应用程序资源,以避免代码重复:
<MultiBinding x:Key="MyMultiBinding" Converter="{StaticResource ResourceKey=MyConverter}">
<Binding Path="IsConnected" />
<Binding Path="IsOpened" />
</MultiBinding>
以下是我宣布按钮的方式:
<Button Name="MyButton" Content="Click me!" IsEnabled="{StaticResource ResourceKey=MyMultiBinding}" />
在运行时,我收到以下错误:“Set属性IsEnabled抛出异常...... MultiBinding不是属性IsEnabled的有效值”。
我无法理解为什么这不起作用。你能指点我正确的方法吗?谢谢。
答案 0 :(得分:0)
我不知道这是否是最好的解决方案,但正如Viv所说,将MultiBinding包装成一种风格就可以了。这是Style的代码:
<Style x:Key="MyStyle" TargetType="Button">
<Style.Setters>
<Setter Property="IsEnabled">
<Setter.Value>
<MultiBinding Converter="{StaticResource ResourceKey=MyConverter}">
<Binding Path="IsConnected" />
<Binding Path="IsDataAccessOpened" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
按钮的代码:
<Button Name="MyButton" Content="Click me!" Style={StaticResource ResourceKey=MyStyle} />
答案 1 :(得分:0)
您不能将布尔IsEnabled
属性设置为类型MultiBinding
的值。这就是发生的事情。
正如@Viv指出的那样,你可以声明一个Style
来完成繁重的工作:
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="IsEnabled">
<Setter.Value>
<MultiBinding Converter="{StaticResource ResourceKey=MyConverter}">
<Binding Path="IsConnected" />
<Binding Path="IsOpened" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
<Button Name="MyButton" Content="Click me!" Style="{StaticResource ButtonStyle}" />
如果Button
DataContext
具有这些属性,则效果很好。如果他们每个人都有不同的DataContext
,那么它就会特别好用,因为不同的原因启用它们。
如果它们都绑定到同一个DataContext
,或者属性位于不同的对象上,则可以使用Freezable Trick提供按钮绑定到的值:
<BindingProxy x:Key="isEnabled">
<BindingProxy.Data>
<MultiBinding Converter="{StaticResource ResourceKey=MyConverter}">
<Binding Path="IsConnected" />
<Binding Path="IsOpened" />
</MultiBinding>
</BindingProxy.Data>
</BindingProxy>
<Button Name="MyButton" Content="Click me!" IsEnabled="{Binding Data, Source={StaticResource isEnabled}}" />