【问题标题】:Bind a property to an existing Binding将属性绑定到现有绑定
【发布时间】:2013-07-09 13:05:10
【问题描述】:

我有一个带有多个按钮的界面。我想根据“复杂”条件启用或禁用这些按钮。为了避免代码重复,我将此 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 property IsEnabled throw an exception... MultiBinding is not a valid value for property IsEnabled”。

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

【问题讨论】:

  • 不确定是否允许 MultiBinding 作为资源。我什至无法编译A 'MultiBinding' cannot be set on the 'Value' property of type 'DictionaryEntry'. A 'MultiBinding' can only be set on a DependencyProperty of a DependencyObject. 最简单的方法似乎是将其包装成Style 并在那里进行属性绑定并将Style 应用到您的控件,或者使用特定键或使其隐式. Example
  • MultiBinding 被允许作为资源。我可以毫无问题地在 Application.Resources 中添加一个。无论如何,我将它包装成一个 Style 并且它正在工作。谢谢!

标签: wpf xaml binding properties staticresource


【解决方案1】:

您不能将布尔型 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}}" />

【讨论】:

    【解决方案2】:

    我不知道这是否是最好的解决方案,但正如 Viv 所说,将 MultiBinding 包装成一种样式就可以了。这是样式的代码:

    <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} />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-27
      • 2014-03-22
      • 2018-09-30
      • 1970-01-01
      • 2017-01-25
      • 2022-07-31
      • 1970-01-01
      相关资源
      最近更新 更多