将ViewModel绑定到Prism.Forms中的XAML视图

时间:2017-03-13 18:00:21

标签: forms xaml xamarin mvvm prism

在Xamarin.Forms中,可以通过ViewModel标记指定标记中与XAML页面一起使用的<ContentPage.BindingContext>。这样做的唯一好处就是我可以看到 - 与Prism.Forms&#39;将视图绑定到ViewModel的更灵活的方法是在添加{Binding}属性值时,在XAML中获取有关VM属性/命令的 IntelliSense

同样,Prism.Forms有更好的方法来绑定视图和ViewModel,但是当我使用它们时,我通常不会在XAML页面中获得 IntelliSense - 这对于复杂的View / ViewModel实际上非常有帮助。

我没有看到任何可以在Prism.Forms方案中使用<ContentPage.BindingContext>标记的原因。但感觉就像我在打破&#34; Prism想要做View - 到 - ViewModel绑定的方式。

此外,我担心我的ViewModel将被不必要地实例化两次,一旦Xamarin.Forms创建它;而一旦Prism确实具有约束力。不确定这是否正确...另外,我可以看到一个场景,我想在不同的时间将我的视图绑定到不同的ViewModel;例如,针对Android与iOS的不同VM类。棱镜允许我这样做,但我担心不会使用<ContentPage.BindingContext>标签。

是否有支持/推荐的方法来识别我的XAML中的ViewModel仅用于设计时间目的(即用于智能感知),但Prism的视图到视图模型绑定逻辑在运行时发生 - 时间?我想我要完全忽略<ContentPage.BindingContext>标记,除非我在Visual Studio中编辑XAML。

编辑:我上面的问题不正确,我希望看到的XAML View IntelliSense 不是由Visual Studio提供的,而是由JetBrains提供的 ReSharper 。下面描述的解决方案 添加了预期的 IntelliSense 功能,但仅限于安装了 ReSharper 的开发环境中(或者可能还有其他Visual具有此功能的Studio加载项。)

2 个答案:

答案 0 :(得分:3)

下面Dan的回答很有帮助,但Atsushi Nakamura已经描述了一个更好的解决方案 - 这里:Enable IntelliSense for ViewModel members with Prism for Xamarin.Forms blog

基本上,他的方法是(1)创造一个假的&#34;设计时&#34;视图模型的服务定位器 - 为每个ViewModel类型返回null;然后(2)在XAML视图中引用此服务定位器作为页面的BindingContext的静态绑定。这在设计时提供 IntelliSense (当存在ReSharper或类似的Visual Studio加载项时);但在运行时,服务定位器返回null,Prism执行其典型的View-to-ViewModel绑定。

基于对GitHub上Prism存储库中创建的问题的讨论,上述方法将被添加到官方Prism for Xamarin.Forms docs作为提供设计时数据的推荐方法。请在此处查看该讨论:related Prism GitHub issue

这解决了我的问题并添加了我正在寻找的设计时 IntelliSense

答案 1 :(得分:2)

虽然我不能说我听说过如何最好地处理这个问题,我至少可以给你答案。微软/ Xamarin的工具仍然是一个非常新的稳定版本,不幸的是开箱即​​用它似乎不支持在ViewModels中动态加载。我已经开始在GitHub上为Prism创建一个问题,你可以关注here

同时,如果您需要更强类型地绑定绑定,以便Xamarin Forms Previewer可以找到ViewModel,那么我建议设置AutoWire=false,这样Prism就不会再次创建ViewModel。

尽管承认是痛苦的,但有时候处于最前沿(Xaml预览器仍然存在),意味着做出牺牲并且必须打破规则和模式才能使事情发挥作用。希望有所帮助。