WPF 中的 MVVM - 用户控件和 GMap.NET

MVVM in WPF - UserControls and GMap.NET

我已经阅读了几乎所有的教程并检查了堆栈问题,但是我仍然不知道也不明白如何在 MVVM 中管理 WPF 用户控件,特别是其他人提供的那些 GMap.NET.

我试图在我的应用程序中遵循 MVVM 模式,但是我不知道如何在其中初始化和管理 GMap.NET WPF 控件。在标准方法中,它需要这样的管理:

gmap.MapProvider = GMap.NET.MapProviders.GoogleMapProvider.Instance;
GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
gmap.DragButton = MouseButton.Left;
gmap.SetPositionByKeywords("Paris, France");
gmap.ShowCenter = false;

如何在不停止 MVVM 的情况下执行此操作?可能吗?如有任何帮助,我将不胜感激。

如评论中所建议,任何仅初始化视图的代码都可以放在代码后面。

如果可能,视图模型中的属性应该绑定视图。这是首选方式,应该会击败大多数用例。

但是,有些控件很复杂,并且有一个 "advanced" API,它不仅包含依赖属性,还包含方法和事件。

如果需要从视图模型调用 "view methods",基于事件的方法可以正常工作。因为视图知道视图模型,所以它可以订阅视图模型上的事件(例如在 DataContextChanged 事件中)。 (另见 that answer示例: 您想要从视图模型中调用方法 gmap.SetPositionByKeywords。只需给视图模型一个事件 RequestSetPositionByKeyWords,让视图订阅该方法并在引发事件时调用 gmap.SetPositionByKeywords。参数和 return 值可以通过事件参数传输。这是一个尊重 MVVM 原则的好方法。

您还可以在视图模型中创建控件:

GMapControl vmGmapControl{get;set;} 

在构造函数中:

vmGmapControl=new GmapControl();
//GMap control initialization logic...

并绑定视图:

<UserControl Content="{Binding vmGmapControl}"/>

它可能不遵循 MVVM,但否则您将不得不重写您计划使用的所有当前无法绑定到依赖属性的属性(例如标记 属性)。