是否可以在MultiBinding中使用DynamicResource?

slu*_*ter 6 wpf markup-extensions dynamicresource multibinding

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

<TextBlock Text="{DynamicResource keyToMyString}" />
Run Code Online (Sandbox Code Playgroud)

但是如果你需要在MultiBinding上使用StringFormat,你很快就会遇到问题,因为你需要插入动态文本或想要组合几个字符串.例如,如果我的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>
Run Code Online (Sandbox Code Playgroud)

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

使用TextBlock,我可以通过使用TextBlock内容的几个Run项来避免这个问题(参考):

<TextBlock >
    <Run Text="{DynamicResource CompanyName}" />
    <Run Text="{DynamicResource ProductName}" />
    <Run Text="{DynamicResource MajorVersion}" />
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*nov 2

动态资源引用有一些显着的限制。至少必须满足以下条件之一:

  • 正在设置的属性必须是 aFrameworkElement或上的属性FrameworkContentElement。该财产必须有DependencyProperty.
  • 该引用适用于 a 内的值Style Setter
  • 所设置的属性必须是 a 上的属性,该属性作为 a或属性Freezable的值或值提供。FrameworkElementFrameworkContentElementSetter

来源:XAML 资源、MSDN

因此,如果使用Binding,则违反了所有声明。

如图所示,DynamicResourceExtension对于该类的实例来说效果很好Run,因为该类Run(至少)是从该类派生的FrameworkContentElement

其他参考资料

  1. 资源部分:发生了什么第二部分:WPF 中的更多属性更改
  2. WPF:依赖属性和资源