是否可以在MultiBinding中使用DynamicResource?

时间:2013-06-06 13:02:43

标签: wpf multibinding markup-extensions dynamicresource

在这种情况下,我希望将资源字典中声明的字符串用作Text属性上的绑定的一部分。仅绑定一个动态资源字符串不是问题:

<TextBlock Text="{DynamicResource keyToMyString}" />

但如果您需要在StringFormat上使用MultiBinding,则会很快遇到问题,因为您需要插入动态文本或想要组合多个字符串。例如,如果我的MultiBinding看起来像这样:

<TextBlock.Text>
    <MultiBinding StringFormat="{}{0} {1} some more text">
        <Binding Source="{x:Static Resources:Strings.string1}" />
        <Binding Source="{x:Static Resources:Strings.string2}" />
    </MultiBinding>
<TextBlock.Text>

我可以将指定资源文件中的string1string2注入绑定文本,没有任何问题。但我找不到以同样的方式使用动态资源中的字符串的方法。 (我正在使用此方法将公司和产品名称从合并的资源字典中注入文本中。)

使用TextBlock我可以通过为TextBlock内容(Run)使用多个reference项来解决此问题:

<TextBlock >
    <Run Text="{DynamicResource CompanyName}" />
    <Run Text="{DynamicResource ProductName}" />
    <Run Text="{DynamicResource MajorVersion}" />
</TextBlock>

但是当需要将动态资源绑定到Window Title属性时,这没有任何帮助。无论如何,通过使用现有的标记扩展(如x:Static等)(创造性的,必要的)来实现这一目标?或者我们是否必须编写自己的标记扩展来实现这一目标?

1 个答案:

答案 0 :(得分:2)

  

动态资源引用有一些值得注意的限制。必须至少满足下列条件之一:

     
      
  • 正在设置的媒体资源必须是FrameworkElementFrameworkContentElement的媒体资源。该属性必须由DependencyProperty支持。
  •   
  • 该引用适用于Style Setter
  • 内的值   
  • 要设置的属性必须是Freezable上的属性,该属性是FrameworkElementFrameworkContentElement属性或Setter值的值。< / LI>   

Source: XAML Resources, MSDN

因此,如果使用Binding,则会违反所有陈述。

如图所示,DynamicResourceExtension适用于Run类的实例,因为Run类(至少)来自FrameworkContentElement类。

其他参考资料

  1. 资源部分:Wha' Happened Part Two: More Property Changes in WPF
  2. WPF: Dependency Properties & Resources