我有一个多语言应用程序,我试图以这种方式将Fallbackvalue设置为动态资源:
<TextBlock Text="{Binding SomeProperty, FallbackValue='{DynamicResource somekEY}'" />
这将引发异常:
您可以设置&#39; DynamicResourceExtension&#39;对于&#39; StringFormat&#39;类型&#39;绑定&#39;属性。您可以设置&#39; DynamicResourceExtension&#39;仅适用于DependencyObject的DependencyProperty。
如何处理这种情况?
答案 0 :(得分:1)
问题是DynamicResource
的作用类似于绑定。您无法绑定Binding
本身的属性(或任何不是DependecyProperty
的属性,如错误消息中所述)。当您尝试使用绑定时,您实际上会看到相同类型的错误消息:(例如{Binding SomeProperty, FallbackValue={Binding SomeOtherProperty}}
)
这是PriorityBinding
的用武之地。它允许将一系列后备值指定为绑定本身。使用PriorityBinding
指定Bindings列表,第一个具有有效值的绑定是使用的绑定。理想情况下,我们可以这样写:
<TextBlock>
<TextBlock.Text>
<PriorityBinding>
<Binding Path="SomeProperty" />
<DynamicResource ResourceKey="somekEY" />
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
不幸的是,DynamicResourceExtension
无法直接转换为像上面那样在PriorityBinding(或MultiBinding)中使用的绑定,因此我们必须使用一个小技巧(上面的例子没有工作)。我们将使用Tag
属性(这是一个没有效果的属性,基本上用于保存这样的技巧的值)来捕获DynamicResource的值,然后在{中使用RelativeSource绑定{1}}得到它:
PriorityBinding