将 ViewModel 绑定到 XAML 中的视图 Prism.Forms
Bind ViewModel to XAML View in Prism.Forms
在 Xamarin.Forms 中,可以通过 <ContentPage.BindingContext>
标记在标记中指定要与 XAML 页面一起使用的 ViewModel
。我可以看到这样做的唯一优势 - 与 Prism.Forms' 将视图绑定到 ViewModel
s 的更灵活的方法 - 就是我得到 IntelliSense在 XAML 添加我的 {Binding}
属性值时关于 VM properties/commands。
同样,Prism.Forms 有更好的方法来绑定视图和 ViewModel
s,但是当我使用它们时,我通常不会得到 IntelliSense在 XAML 页面中 - 这实际上对复杂的 View/ViewModel.
很有帮助
我看不出有什么理由不能在 Prism.Forms 场景中使用 <ContentPage.BindingContext>
标签。但这感觉就像我 "breaking" Prism 想要进行 View
-to-ViewModel
绑定的方式。
此外,我担心我的 ViewModel
会被不必要地实例化两次,一次是在 Xamarin.Forms 创建它时;一次是在 Prism 进行绑定时。不确定这是否正确...此外,我可以看到一个场景,我想在不同时间将我的视图绑定到不同的 ViewModel
;例如,Android 与 iOS 的不同 VM class。 Prism 允许我这样做,但我担心这不适用于 <ContentPage.BindingContext>
标签。
是否有一种 supported/recommended 方法可以在我的 XAML 中识别我的 ViewModel
仅用于设计时目的(即智能感知)但具有 Prism 的视图到视图模型绑定逻辑发生在 运行 时间?我想我希望完全忽略 <ContentPage.BindingContext>
标签,除非我正在编辑 Visual Studio.
中的 XAML
编辑:我上面的问题是不正确的,因为我期望看到的 XAML 视图 IntelliSense 不是由 Visual Studio 提供的,而是由JetBrains ReSharper。下面描述的解决方案 did 添加回预期的 IntelliSense 功能,但仅在 ReSharper 的开发环境中已安装(或者可能有其他 Visual Studio 具有此功能的加载项)。
虽然我不能说我听说过关于如何最好地处理这个问题的任何共识,但我至少可以给你一个答案。来自 Microsoft/Xamarin 的工具就稳定版本而言仍然非常新,不幸的是,开箱即用它似乎不支持在 ViewModels 中动态加载。我已经在 GitHub 上为 Prism 创建了一个问题,您可以关注 here.
同时,如果您需要使绑定类型更强,以便 Xamarin Forms Previewer 可以找到 ViewModel,那么我建议设置 AutoWire=false
,这样 Prism 就不会第二次创建 ViewModel。
虽然承认这一点很痛苦,但有时处于最前沿(Xaml 预览器仍然如此)意味着做出牺牲并不得不打破规则和模式才能使事情正常进行。希望对您有所帮助。
Dan 在下面的回答很有帮助,但 Atsushi Nakamura 描述了更好的解决方案 - 此处:Enable IntelliSense for ViewModel members with Prism for Xamarin.Forms blog
本质上,他的方法是 (1) 为视图模型创建一个伪造的 "design-time" 服务定位器 - 对于每个 ViewModel 类型 returns null;然后 (2) 在 XAML 视图中将此服务定位器引用为页面 BindingContext 的静态绑定。这在设计时提供 IntelliSense(当存在 ReSharper 或类似的 Visual Studio 加载项时);但在 运行 时间,服务定位器 returns 为空,Prism 执行其典型的视图到视图模型绑定。
根据 GitHub 上 Prism 存储库中创建的问题的讨论,上述方法将添加到 Xamarin.Forms 文档的官方 Prism 中,作为提供的推荐方法设计时间数据。请参阅此处的讨论:related Prism GitHub issue
这样就解决了我的问题并加回了我一直在寻找的设计时 IntelliSense。
在 Xamarin.Forms 中,可以通过 <ContentPage.BindingContext>
标记在标记中指定要与 XAML 页面一起使用的 ViewModel
。我可以看到这样做的唯一优势 - 与 Prism.Forms' 将视图绑定到 ViewModel
s 的更灵活的方法 - 就是我得到 IntelliSense在 XAML 添加我的 {Binding}
属性值时关于 VM properties/commands。
同样,Prism.Forms 有更好的方法来绑定视图和 ViewModel
s,但是当我使用它们时,我通常不会得到 IntelliSense在 XAML 页面中 - 这实际上对复杂的 View/ViewModel.
我看不出有什么理由不能在 Prism.Forms 场景中使用 <ContentPage.BindingContext>
标签。但这感觉就像我 "breaking" Prism 想要进行 View
-to-ViewModel
绑定的方式。
此外,我担心我的 ViewModel
会被不必要地实例化两次,一次是在 Xamarin.Forms 创建它时;一次是在 Prism 进行绑定时。不确定这是否正确...此外,我可以看到一个场景,我想在不同时间将我的视图绑定到不同的 ViewModel
;例如,Android 与 iOS 的不同 VM class。 Prism 允许我这样做,但我担心这不适用于 <ContentPage.BindingContext>
标签。
是否有一种 supported/recommended 方法可以在我的 XAML 中识别我的 ViewModel
仅用于设计时目的(即智能感知)但具有 Prism 的视图到视图模型绑定逻辑发生在 运行 时间?我想我希望完全忽略 <ContentPage.BindingContext>
标签,除非我正在编辑 Visual Studio.
编辑:我上面的问题是不正确的,因为我期望看到的 XAML 视图 IntelliSense 不是由 Visual Studio 提供的,而是由JetBrains ReSharper。下面描述的解决方案 did 添加回预期的 IntelliSense 功能,但仅在 ReSharper 的开发环境中已安装(或者可能有其他 Visual Studio 具有此功能的加载项)。
虽然我不能说我听说过关于如何最好地处理这个问题的任何共识,但我至少可以给你一个答案。来自 Microsoft/Xamarin 的工具就稳定版本而言仍然非常新,不幸的是,开箱即用它似乎不支持在 ViewModels 中动态加载。我已经在 GitHub 上为 Prism 创建了一个问题,您可以关注 here.
同时,如果您需要使绑定类型更强,以便 Xamarin Forms Previewer 可以找到 ViewModel,那么我建议设置 AutoWire=false
,这样 Prism 就不会第二次创建 ViewModel。
虽然承认这一点很痛苦,但有时处于最前沿(Xaml 预览器仍然如此)意味着做出牺牲并不得不打破规则和模式才能使事情正常进行。希望对您有所帮助。
Dan 在下面的回答很有帮助,但 Atsushi Nakamura 描述了更好的解决方案 - 此处:Enable IntelliSense for ViewModel members with Prism for Xamarin.Forms blog
本质上,他的方法是 (1) 为视图模型创建一个伪造的 "design-time" 服务定位器 - 对于每个 ViewModel 类型 returns null;然后 (2) 在 XAML 视图中将此服务定位器引用为页面 BindingContext 的静态绑定。这在设计时提供 IntelliSense(当存在 ReSharper 或类似的 Visual Studio 加载项时);但在 运行 时间,服务定位器 returns 为空,Prism 执行其典型的视图到视图模型绑定。
根据 GitHub 上 Prism 存储库中创建的问题的讨论,上述方法将添加到 Xamarin.Forms 文档的官方 Prism 中,作为提供的推荐方法设计时间数据。请参阅此处的讨论:related Prism GitHub issue
这样就解决了我的问题并加回了我一直在寻找的设计时 IntelliSense。