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

Nik*_*ruk 2 mvvmcross

可能吗?:

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

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

fma*_*oni 5

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

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

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

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

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

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


还有另一种resx使用ResxLocalization插件绑定文件中的字符串的方法,即使它不支持Format,您也可以解决该问题(您可以检查此问题功能请求:将MvxLang与Format结合使用以跟踪此问题)

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

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

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

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

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

local:MvxLang="Text InStock"

请注意,它正在使用MvxLang而不是MvxBind。顺便说一句,您可以同时使用它们,但是如果您使用Textin,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);
}
Run Code Online (Sandbox Code Playgroud)

并在您看来(由于Format我们无法MvxLang在此处使用):

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

HIH