有可能吗?:
//...
local:MvxBind="Text Format('{0} {1}', Stock, @string/in_stock)"/>
//...
我想使用ViewModel中的属性和 strings.xml 中的字符串资源来构造文本值,但是上面的示例不起作用。
答案 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