从语言文件绑定动态值的正确方法是什么?

时间:2014-05-12 22:38:02

标签: c# xaml mvvm windows-runtime

我有一个视图模型,在我的语言资源文件中有一个条目的名称 我试图将此值直接绑定到我的XAML中TextBlock的x:Uid属性,但是出现了XAML错误。

为了解决这个限制我想改变属性以从语言文件返回值,但是担心这样做可能不是有效的MVVM解决方案。
我还想过创建一个转换器来设置文本。

不起作用的方式:

<StackPanel Orientation="Horizontal">
    <Image Margin="0,0,20,0" Source="{Binding IconPath}" />
    <TextBlock x:Uid="{Binding LanguageResourceName}" />
</StackPanel>

我绑定的视图模型:

class Tab : ViewModelBase
{
    private string _IconPath,
        _LanguageResourceName;
    private ViewModelBase _ViewModel;

    /// <summary>
    /// The path to the icon to show on the tab.
    /// </summary>
    public string IconPath
    {
        get { return _IconPath; }
        set { SetProperty(ref _IconPath, value); }
    }

    /// <summary>
    /// The name of the entry in the language resource file to display on the tab.
    /// </summary>
    public string LanguageResourceName
    {
        get { return _LanguageResourceName; }
        set { SetProperty(ref _LanguageResourceName, value); }
    }

    /// <summary>
    /// The contents of the tab.
    /// </summary>
    public ViewModelBase ViewModel
    {
        get { return _ViewModel; }
        set { SetProperty(ref _ViewModel, value); }
    }
}

那么解决这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

转换器是最好的方法。查看我的回答here以获得快速解释。我已经复制了我在下面定义的转换器。

ResourceController是一个简单的控制器,它获取对ResourceLoader的引用,并通过方法GetString(string resourceId)检索值。

public class ResourceTranslationConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var valString = value as string;

        // If what is being converted is a string, return the resource translation
        // Else return something else, such as the object itself
        return valString == null ? value : ResourceController.GetString(valString);
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

绑定然后就像:

<TextBlock Text="{Binding LanguageResourceName, Converter={StaticResource ResourceTranslationConverter}}" />

确保您已定义了可访问的ResourceTranslationConverter。可能在Page.Resources或甚至在App.xaml中(因为您只需要一个静态参考)。

希望这有助于编码!