MvvmCross:Android布局绑定字符串资源

时间:2018-09-11 08:22:44

标签: mvvmcross

有可能吗?:

//...
local:MvxBind="Text Format('{0} {1}', Stock, @string/in_stock)"/>
//...

我想使用ViewModel中的属性和 strings.xml 中的字符串资源来构造文本值,但是上面的示例不起作用。

1 个答案:

答案 0 :(得分:3)

AFAIK不能直接绑定到Android字符串。

使用Xamarin和Mvx,您应该使用resx文件来支持国际化(i18n)。

您可以使用ViewModel上的索引器从绑定中轻松访问resx文件:

public abstract class BaseViewModel : MvxViewModel
{
    public string this[string key] => Strings.ResourceManager.GetString(key);
}

然后在视图中可以像这样使用它:

local:MvxBind="Text Format('{0} {1}', Stock, [InStock])"


还有另一种使用ResxLocalization插件在resx文件中绑定字符串的方法,尽管它不支持Format,但是您可以解决该问题(您可以检查此问题Feature request: Combine MvxLang with Format跟踪此事

基本上,您可以在PCL / NetStandard / Shared项目中创建Strings.resx文件并进行注册:

Mvx.RegisterSingleton(new MvxResxTextProvider(Strings.ResourceManager));

然后,在基本视图模型中,您需要实现此属性,以便您的视图和视图模型可以访问i18n:

public IMvxLanguageBinder TextSource => new MvxLanguageBinder("", GetType().Name);

最后,您可以使用以下命令调用它:

local:MvxLang="Text InStock"

请注意,它使用的是MvxLang而不是MvxBind。顺便说一句,您可以同时使用它们,但是如果在Text中使用MvxLang,则不要在MvxBind中使用它,因为这样会出现问题。

最后,您可以将插件与索引器结合使用,以降低ViewModel与resx文件之间的耦合,并通过以下方式解决对绑定中Format的支持(来自上述问题):

public abstract class BaseViewModel : MvxViewModel
{
    private IMvxTextProvider _textProvider;
    public BaseViewModel(IMvxTextProvider textProvider)
    {
        _textProvider = textProvider;
    }

    public string this[string key] => _textProvider.GetText("", "", key);
}

,并且在您看来(由于Format在这里我们无法使用MvxLang

local:MvxBind="Text Format('{0} {1}', Stock, [InStock])"

HIH