使用MVVM模式控制代码?

时间:2016-01-24 17:56:23

标签: c# wpf mvvm

我被要求在WPF中开发一个包含地图控件(OnlineMapControl)的对话框窗口。地图控制&相关的业务逻辑位于代码背后。我已将控件构建为窗口,并编写了一个简单的视图模型。

触发对话框的父视图来自其视图模型中的按钮命令。我知道理想情况下我们应该使用IDialogService或等效服务,但老年人建议我在视图模型命令方法中使用.showdialog()la:

Public ShowChildDialogCommandAction()
{
  DialogViewModel dialogViewModel = NewDialogViewModel();
  DialogView dialogview = new DialogView(dialogViewModel);

  dialogView.ShowDialog();
}

除了紧密耦合之外,这种方法很好。当我尝试访问基于地图控件的子视图代码的属性时出现问题。 dialogViewModel实例对OnlineMapControl一无所知,因此我发现自己试图通过所有这些具有重复属性名称和类的类来追逐属性值。在this.onlineMapControl.zoomLevel = this.dialogViewModel.zoomLevel等后面的DialogView代码中进入逻辑意大利面。这只是一个非常糟糕的代码味道。你如何处理类似于此的设计,其中视图中的复杂控制只能通过代码后面的代码来访问。保持MVVM模式完好无损?

1 个答案:

答案 0 :(得分:0)

如果您正在使用正确的MVVM,那么您的视图模型应该是视图的DataContext:

DialogViewModel dialogViewModel = NewDialogViewModel();
DialogView dialogview = new DialogView{DataContext = dialogViewModel};

从那时起,DialogView XAML应该使用数据绑定,并且不应该有任何代码隐藏,因此在它和DialogViewModel之间复制任何数据都变得没有实际意义。

顺便说一句,服务并不是实现对话框的唯一方法,使用常规数据绑定很容易实现,就像我在an article I wrote last year中所展示的那样。