22

我已经玩 WPF 很长一段时间了,但是今天第一次,我需要MultiBinding在另一个里面嵌套一个,比如:

<MultiBinding>
   <Binding />       
   <MultiBinding>
      <Binding />
      <Binding />
   </MultiBinding>
</MultiBinding>

我收到一个异常,表明框架不允许这样做:

XamlParseException 未处理:向“System.Collections.ObjectModel.Collection(System.Windows.Data.BindingBase)”类型的集合添加值引发异常。

InnerException更明确:

BindingCollection 不支持 MultiBinding 类型的项目。只允许绑定。

所以在网上挖掘更多信息,我偶然发现了这个 Microsoft Connect 问题,这正是我的问题。

感谢您的反馈。WPF 今天不支持这个。此功能已被请求多年(最近一次是本月早些时候 - 请参阅https://connect.microsoft.com/WPF/feedback/details/650164/nested-multibinding)。我们将在未来的版本中继续考虑这一点。

现在我已经平静下来,我不会很容易。我仍然需要这个,我怎样才能嵌套 MultiBindings

4

6 回答 6

4

如果你有一个带参数的转换器,你可以这样做:

  • 创建一个用于将“固定”数据传递给转换器的类
  • 添加DependencyProperties到类(以便您可以绑定 Xaml 中的值)
  • 在您的 xaml 中,使用带有转换器的绑定而不是多重绑定,如下所示:

    <MultiBinding>
        <Binding Source="SomeObject" Path="CoreValue" Converter="{StaticResource YourNewConverter}">
            <Binding.ConverterParameter>
                <ns:ParameterClass Value1="{Binding Parameter1}" Value2="{Binding Parameter1}" />
            </Binding.ConverterParameter>
        </Binding>
     .... 
    

限制是(AFAIK)该值仅在更改时才会重新计算CoreValue- 如果转换器参数更改,它不会自动重新绑定。

(对于任何错误,我深表歉意,我在没有 VS 测试的情况下输入这个......)

于 2012-04-23T13:04:53.803 回答
4

我意识到这是一个老问题,但我刚刚遇到了与 OP 完全相同的问题。幸运的是,在我的情况下,我可以绑定到已经计算多重绑定结果的子元素,但这让我开始思考......

一个(虽然公认不是很干净)解决方案是将多值绑定的值写入“备用”属性,例如元素的“标签”,然后您可以通过指定“在其他多值绑定中引用它”元素名称”属性。

如果您需要多个嵌套的多值绑定,那么您可以创建一个带有一些依赖属性的“假”对象来存储多个中间结果。

可惜微软没有实现一个正确嵌套的系统......

于 2015-03-11T10:52:08.873 回答
4

我知道这是一个老问题,但我认为这是一个更好的方法:

<FrameworkElement x:Name="IsBuyAndAmountInReference">
    <FrameworkElement.Tag>
        <MultiBinding Converter="{StaticResource LogicAndToBool}">
            <Binding Path="OrderData.IsBuy" />
            <Binding Path="OrderData.AmountInReference" />
        </MultiBinding>
    </FrameworkElement.Tag>
</FrameworkElement>
<FrameworkElement x:Name="IsSellAndAmountInBase">
    <FrameworkElement.Tag>
        <MultiBinding Converter="{StaticResource LogicAndToBool}">
            <Binding Path="OrderData.IsBuy" Converter="{StaticResource BooleanToBooleanInvert}" />
            <Binding Path="OrderData.AmountInReference" Converter="{StaticResource BooleanToBooleanInvert}" />
        </MultiBinding>
    </FrameworkElement.Tag>
</FrameworkElement>

<Slider Grid.Row="2" Grid.ColumnSpan="4">
    <Slider.Visibility>
        <MultiBinding Converter="{StaticResource LogicOrToVisibility}">
            <Binding ElementName="IsBuyAndAmountInReference" Path="Tag" />
            <Binding ElementName="IsSellAndAmountInBase" Path="Tag" />
        </MultiBinding>
    </Slider.Visibility>
</Slider>
于 2020-05-23T20:06:42.040 回答
3

其他建议的替代方法是使用附加属性将嵌套MultiBinding的 s 保存为中间值。

例如,而不是:

<Element>
  <Element.Property>
    <MultiBinding>
      <Binding Path="A" />       
      <MultiBinding>
        <Binding Path="B" />
        <Binding Path="C" />
      </MultiBinding>
    </MultiBinding>
  </Element.Property>
</Element>

...做这个:

<Element Name="ElementName">
  <ElementProperties.AttachedProperty>
    <MultiBinding>
      <Binding Path="B" />
      <Binding Path="C" />
    </MultiBinding>
  </ElementProperties.AttachedProperty>
  <Element.Property>
    <MultiBinding>
      <Binding Path="A" />       
      <Binding ElementName="ElementName" Path="(ElementProperties.AttachedProperty)" />
    </MultiBinding>
  </Element.Property>
</Element>

我知道这个问题现在已经有六年多了,但我遇到了它,所以其他人也会这样做。

于 2018-12-10T14:36:29.073 回答
1

如果您要绑定到一个字符串,您可以使用 StringFormat 就像在这个例子中一样:

 <TextBlock>
   <TextBlock.Text>
     <MultiBinding StringFormat="{}{0:0.###}/{1:0.###}" Mode="OneWay">
                        <Binding ElementName="This" Path="AggregatedDocDetail.ConfirmedQty"></Binding>
                        <Binding ElementName="This" Path="AggregatedDocDetail.Qty">   </Binding>
       </MultiBinding>
     </TextBlock.Text>
   </TextBlock>
于 2012-04-23T12:42:39.140 回答
0

只需使用一个多重绑定和一个 MultiConverter。

或者我更喜欢在您的视图模型/数据上下文的一个属性中公开您的状况。

于 2012-04-23T12:29:46.063 回答