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

将ViewModel绑定到Prism.Forms中的XAML视图,forms,xaml,xamarin,mvvm,prism,Forms,Xaml,Xamarin,Mvvm,Prism,在Xamarin.Forms中,可以通过标记在标记内指定要与XAML页面一起使用的ViewModel。这样做的唯一好处是,我可以看到-vs.Prism.Forms将视图绑定到ViewModels的更灵活的方法是,当添加{Binding}属性值时,我可以在XAML中获得有关VM属性/命令的智能感知 同样,Prism.Forms有更好的方法来绑定视图和ViewModels,但是当我使用它们时,我通常无法在XAML页面中获得IntelliSense,这实际上对复杂的视图/视图模型非常有帮助 我看不出有

在Xamarin.Forms中,可以通过
标记在标记内指定要与XAML页面一起使用的
ViewModel
。这样做的唯一好处是,我可以看到-vs.Prism.Forms将视图绑定到
ViewModel
s的更灵活的方法是,当添加
{Binding}
属性值时,我可以在XAML中获得有关VM属性/命令的智能感知

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

我看不出有任何理由不能在Prism.Forms场景中使用
标记。但这感觉就像我在“打破”Prism想要进行
View
-to-
ViewModel
绑定的方式

另外,我担心我的
ViewModel
会被不必要地实例化两次,一次是在Xamarin.Forms创建它时;还有一次,棱镜进行绑定。不确定这是否正确。。。此外,我可以看到一个场景,其中我希望在不同的时间将视图绑定到不同的
ViewModel
s;例如,Android和iOS的不同VM类。Prism允许我这样做,但我担心它无法与当前的
标记一起工作

是否有支持/推荐的方法在我的XAML中识别我的
ViewModel
,仅用于设计时(即用于intellisense),但Prism的视图到ViewModel绑定逻辑是否在运行时发生?我想我希望
标记被完全忽略,除非我在VisualStudio中编辑XAML


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

虽然我不能说我听到过关于如何最好地处理此问题的任何共识,我至少可以给你一个答案。Microsoft/Xamarin的工具作为一个稳定的版本仍然是非常新的,不幸的是,它似乎不支持在ViewModels中动态加载。我已经在GitHub上为Prism创建了一个问题,您可以关注它

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


尽管承认这一点很痛苦,但有时站在最前沿(Xaml预览器仍然是这样)意味着要做出牺牲,必须打破规则和模式才能让事情顺利进行。希望这会有所帮助。

丹下面的回答很有帮助,但中村Atsushi描述了一个更好的解决方案-这里:

本质上,他的方法是(1)为视图模型创建一个假的“设计时”服务定位器,它为每个视图模型类型返回null;然后(2)在XAML视图中将此服务定位器作为页面绑定上下文的静态绑定引用。这在设计期间提供智能感知(当存在ReSharper或类似的Visual Studio加载项时);但在运行时,服务定位器返回null,Prism执行其典型的视图到视图模型绑定

基于对GitHub上Prism存储库中创建的问题的讨论,上述方法将添加到官方Prism for Xamarin.Forms文档中,作为提供设计时数据的推荐方法。请参见此处的讨论:


因此,这解决了我的问题,并重新添加了我正在寻找的设计时IntelliSense。

目前,我不寻求Xamarin XAML预览器支持,只想了解viewmodels上的属性。因此,我认为您有一个很好的建议-使用Xamarin.Forms“viewmodel绑定”技术(使用ContentPage.BindingContext),然后将AutoWire=false。我想我唯一担心的是,我的viewmodels上基于Prism/Unity的构造函数注入将无法工作(因为X.F正在创建VM实例,而不是Prism)。我可以自己尝试一下,但我想知道是否有人对我提出了任何关于不使用Prism View到ViewModel绑定的警告。当前环境没有支持链接视图和ViewModel的直接工具。因此,无论是IntelliSense还是Previewer都不能真正使用它们。这就是说,这个问题的产生是因为在预览程序完成之前,没有真正的工作可以开始,因此这个问题被发布了。希望这有助于澄清。谢谢。我非常感谢你的帮助和信息。仅回应我自己的评论:在我的XAML视图中使用ContentPage.BindingContext标记是不可能的,因为它希望我的ViewModel类具有无参数构造函数;当创建ViewModel实例时会调用它,而我的Prism启用的构造函数具有INavigationService等可注入性。因此,这是一个交易破坏者,我不能使用ContentPage.BindingContext标记。我希望有某种方法使该标记只被VStudio使用,而不是在编译/运行时使用。比如XAML中的一些符号之类的。我已经创建了一个你可以使用的。我想说清楚,我不是说这是一个伟大的战略。然而,我相信它可能会为你提供一个实现目标的方法。