0

我有一个带有多个按钮的界面。我想根据“复杂”条件启用或禁用这些按钮。为了避免代码重复,我将此 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}" />

在运行时,我收到以下错误:“设置属性 IsEnabled 引发异常... MultiBinding 不是属性 IsEnabled 的有效值”。

我不知道为什么这不起作用。您能否指出正确的方法来做到这一点?谢谢你。

4

2 回答 2

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} />
于 2013-07-09T13:49:18.390 回答
0

您不能将 booleanIsEnabled属性设置为 type 的值MultiBinding。这就是正在发生的事情。

正如@Viv 指出的那样,您可以声明 aStyle来完成繁重的工作:

<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}}" />
于 2013-07-09T13:59:13.933 回答