【发布时间】:2013-05-09 21:46:30
【问题描述】:
在我的应用程序中,我有许多帮助页面,它们都有类似的布局 - 标题和正文。
按照我目前的结构方式,对于每个单独的帮助页面,我都有一个 View、ViewModel、.xaml 和 .json 文件。
问题是我的应用程序已经膨胀到有大约 20 个帮助页面(不要问),并且为每个帮助文件复制和粘贴这些页面显然效率低下且容易出错。我想要的是一个单独的 HelpViewModel、HelpView、Page_Help.xml,然后为每个帮助页面创建一个包含相关文本资源的不同 .json 文件。
尽管浏览了现有的 MvvmCross 主题,但我无法弄清楚如何实现这一点。
所以我的 XAML 有一个如下所示的标题:
<TextView
style="@style/HelpTextTitle"
local:MvxBind="{'Text':'Path':'TextSource','Converter':'Language','ConverterParameter':'Heading1'}}"
/>
与 ViewModel 同名的 json 文件(并通过某种自动魔术链接)如下所示:
{
"Heading1":"Sample Help Heading",
}
我有一个可以接受参数的 HelpViewModel - 说出 json 文件的名称
public string HeaderFile { get; private set; }
public HelpViewModel (string headerFile)
{
HeaderFile = headerFile;
}
json 文件目前通过这个类与我认为的 ViewModel 相关联:
public class TextProviderBuilder : MvxTextProviderBuilder
...
protected override IDictionary<string, string> ResourceFiles
{
get
{
var dictionary = this.GetType()
.Assembly
.GetTypes()
.Where(t => t.Name.EndsWith("ViewModel"))
.Where(t => !t.Name.StartsWith("Base"))
.ToDictionary(t => t.Name, t => t.Name);
dictionary[Constants.Shared] = Constants.Shared;
return dictionary;
}
}
并且主应用程序将其注册为文本提供程序(因此促进了我假设的 ViewModel-Json 文件自动化),如下所示:
var builder = new TextProviderBuilder();
this.RegisterServiceInstance<IMvxTextProvider>(builder.TextProvider);
所以很明显,我想以某种方式使用相同的 HelpPage 资源,但能够将该帮助页面上的控件与(最好)具有与参数 (Header1) 相同名称的不同 json 文件绑定,或者在必要时使用不同的单个 json 文件中的参数。
非常感谢!
马修
编辑:以下 Stuart 的解决方案完美运行。当我通过 ViewModel 的构造函数调用 RequestNavigate 时,我只需要传递 json 文件的名称:
return new MvxRelayCommand(() => this.RequestNavigate<GeneralHelpViewModel>(new { helpKey = "DescribeAudioCrimeStatementHelpViewModel" }));
我唯一需要做的就是创建自己的 MvxLanguageBinder,因为在我的 MvvmCross(不是最近)的确切构建中,MvxLanguageBinder 是私有的且不可访问。
我只是复制并粘贴了 Stuart 链接中的版本并使用了该版本:
【问题讨论】:
-
我猜你的意思是 AXML 不是 XAML :)
-
Xaml Axml Shmaml 这对我来说都是一样的 ;)
标签: c# android xamarin.android xamarin mvvmcross