将属性绑定到现有绑定

时间:2013-07-09 13:05:11

标签: wpf xaml binding properties staticresource

我有一个带有多个按钮的界面。我想根据“复杂”条件启用或禁用这些按钮。我将此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的有效值”。

我无法理解为什么这不起作用。你能指点我正确的方法吗?谢谢。

2 个答案:

答案 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}}" />