我使用来自here的安德烈答案创建了一个多语言WPF应用程序。我像这样绑定文本
<TextBlock Text="{DynamicResource Create}"/>
并且可以在运行时从英语切换到法语 - 很好!但是,这不适用于ItemsSource。例如,我有一个ComboBox,它应该显示所有可用的语言:
<ComboBox ItemsSource="{Binding AllLanguages, Source={StaticResource Locator}}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{DynamicResource LanguageId}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
如此设置,组合框不显示任何文字。如果我将文本块的文本设置为Text={LanguageId}
,我会看到LanguageIds&#39; eng&#39; fr&#39; fr&#39;等,所以绑定工作。
使用转换器时:
<TextBlock Text="{Binding LanguageId, Converter={StaticResource DynamicResourceConverter}"/>
语言显示为&#34;英语&#34;和&#34;法语&#34;。但是,当我切换语言时,不会再次调用转换器,并且不会更新语言名称 - 因此这不是真正的解决方法。
我非常感谢关于原因的提示以及如何解决这个问题。
答案 0 :(得分:1)
我先解释为什么有些事情不起作用。
#include <string> // for std::string
#include <vector> // for std::vector
// Old C-style:
// const char *name[]={"Riyaz","Kapil","mayank","Ankur"};
//
// C++ style:
std::vector<std::string> names{ "Name1", "Name2", "Name3", ... };
这是 ....
<DataTemplate>
<TextBlock Text="{DynamicResource LanguageId}"/>
</DataTemplate>
....
的简写,它是一个静态字符串文字,不涉及任何绑定。
如果以下内容可用,那就太棒了,但不幸的是不可能,因为绑定的目标不是Text="{DynamicResource ResourceKey='LanguageId'}"
。
DependancyProperty
您已接近解决方法了。我的建议是尝试以下方法: -
....
<DataTemplate>
<TextBlock Text="{DynamicResource ResourceKey={Binding LanguageId}}"/>
</DataTemplate>
....
您需要展开{{1}},现在也要 ....
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource DynamicResourceConverter}">
<Binding Path="LanguageId"/>
<Binding Path="SomeOtherPropertyThatChangesWhenLanguageIsSwitched" Source="{StaticResource Locator}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
....
。在DynamicResourceConverter
方案中,如果任一绑定表达式更改,则再次调用转换器。您可以编写IMultiValueConverter
,使其仅在提供的对象数组的MultiBinding
上运行,因为不需要第二个值,并且仅提供触发器以便再次调用转换器。
Converter