无法在Fallback上设置DynamiResource

时间:2018-02-11 10:08:51

标签: c# wpf xaml

我有一个多语言应用程序,我试图以这种方式将Fallbackvalue设置为动态资源:

 <TextBlock Text="{Binding SomeProperty, FallbackValue='{DynamicResource somekEY}'" />

这将引发异常:

  

您可以设置&#39; DynamicResourceExtension&#39;对于&#39; StringFormat&#39;类型&#39;绑定&#39;属性。您可以设置&#39; DynamicResourceExtension&#39;仅适用于DependencyObject的DependencyProperty。

如何处理这种情况?

1 个答案:

答案 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