多语言WPF应用程序:不使用组合框

时间:2016-02-18 08:51:51

标签: c# wpf

我使用来自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;。但是,当我切换语言时,不会再次调用转换器,并且不会更新语言名称 - 因此这不是真正的解决方法。

我非常感谢关于原因的提示以及如何解决这个问题。

1 个答案:

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