【问题标题】:MultiBinding with StringFormat - Why is the targetType == object in the inner converter?MultiBinding with StringFormat - 为什么内部转换器中有 targetType == 对象?
【发布时间】:2014-03-30 18:59:51
【问题描述】:

我正在使用 MultibindingStringFormat 将两个字符串绑定到一个文本框。当我将 Converter 添加到其中一个内部绑定时,我注意到一些奇怪的事情,如下所示:

<TextBox>
    <TextBox.Text>
        <MultiBinding StringFormat="{}{0}  {1} ">
            <Binding Path="Foo" 
                        Converter="{StaticResource someConverter}" 
                        ConverterParameter="true" />
            <Binding Path="Bar"  />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

在转换器中,TargetType 属性将是 object。直接在 Text 属性上使用相同的转换器(没有多重绑定)它是 string

我想知道 为什么 会发生这种情况,以及是否有任何方法可以让转换器知道 parent 绑定的类型(不确定术语是否在这里是正确的)。

我问的原因是我通常检查转换器中的 to/from 类型,如果不匹配,我会返回 Binding.DoNothing。

【问题讨论】:

    标签: wpf xaml data-binding type-conversion


    【解决方案1】:

    当您直接在 Text 属性上使用 someConverter 时,TargetType 将为 String,因为它基于 Type of Text 属性.但是当你在Binding中使用一个放在MultiBinding里面的转换器时,没有关于TargetType的信息,默认使用Object

    也许你对IMultiValueConverter很熟悉,所以当你使用它时,TargetType会如你所愿地变成String。看下面的例子:

    <TextBox>
      <TextBox.Text>
        <MultiBinding StringFormat="{}{0}  {1} " Converter="{StaticResource someMultiConverter}" ConverterParameter="true" >
          <Binding Path="Foo" />
          <Binding Path="Bar"  />
        </MultiBinding>
      </TextBox.Text>
    </TextBox>
    

    【讨论】:

    • 感谢您的回答!很明显,内部绑定不是 Text 的直接子代,而是 MultiBinding 的直接子代,但使用 StringFormat 我会假设它需要字符串。现在,您建议的是一种可接受的解决方法(因为对转换器中的类型验证并不那么挑剔),但它需要为相同的任务复制现有的转换器(现在具有多值)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2014-10-04
    • 2013-07-03
    • 2017-08-04
    • 2019-02-11
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多