我有一个视图模型,在我的语言资源文件中有一个条目的名称
我试图将此值直接绑定到我的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); }
}
}
那么解决这个问题的正确方法是什么?
答案 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
中(因为您只需要一个静态参考)。
希望这有助于编码!