【问题标题】:Multilingual WPF Application: not working with combobox多语言 WPF 应用程序:不使用组合框
【发布时间】:2016-02-18 08:51:51
【问题描述】:

我使用来自 here 的 Andre 的回答创建了一个多语言 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 'eng'、'fr' 等,因此绑定有效。

使用转换器时:

<TextBlock Text="{Binding LanguageId, Converter={StaticResource DynamicResourceConverter}"/>

语言显示为“英语”和“法语”。但是,当我切换语言时,不会再次调用转换器并且不会更新语言名称 - 所以这不是真正的解决方法。

非常感谢您提供有关原因以及如何解决此问题的提示。

【问题讨论】:

  • 提供的链接无效。

标签: c# wpf


【解决方案1】:

我将首先解释为什么有些事情不起作用。

    ....
    <DataTemplate>
        <TextBlock Text="{DynamicResource LanguageId}"/>
    </DataTemplate>
    ....

这是Text="{DynamicResource ResourceKey='LanguageId'}" 的简写,它是一个静态字符串文字,不涉及任何绑定。

如果以下内容可用,那就太好了,但不幸的是,不可能,因为绑定的目标不是DependancyProperty

    ....
    <DataTemplate>
        <TextBlock Text="{DynamicResource ResourceKey={Binding LanguageId}}"/>
    </DataTemplate>
    ....

您已接近解决方法。我的建议是尝试以下方法:-

    ....
    <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,使其仅对提供的​​对象数组的values[0] 进行操作,因为不需要第二个值,并且只为再次调用转换器提供触发器。

    public class DynamicResourceConverter: IValueConverter, IMultiValueConverter
    {
        ....
        // original converter implementation for IValueConverter
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            ....
        }

        // newly added converter implementation for IMultiValueConverter
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            //call the original converter method with one value (assuming you've checked the array has at least one item!!
            return Convert(values[0], targetType, parameter, culture)
        }

        ....
    }

【讨论】:

  • 感谢您的解释和帮助!
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2021-02-18
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2015-12-14
相关资源
最近更新 更多