【发布时间】:2016-01-25 14:49:35
【问题描述】:
我被要求在 WPF 中开发一个包含地图控件 (OnlineMapControl) 的对话框窗口。地图控制和相关的业务逻辑位于代码后面。我已经将我的控件构建为一个窗口,并且还编写了一个简单的视图模型。
触发对话框的父视图来自其视图模型中的按钮命令。我知道理想情况下我们应该使用 IDialogService 或等效项,但是前辈建议我在视图模型命令方法中使用 .showdialog() :
Public ShowChildDialogCommandAction()
{
DialogViewModel dialogViewModel = NewDialogViewModel();
DialogView dialogview = new DialogView(dialogViewModel);
dialogView.ShowDialog();
}
这很好用,除了紧耦合。当我试图访问基于地图控件后面的子视图代码的属性时,就会出现问题。 dialogViewModel 实例对 OnlineMapControl 一无所知,因此我发现自己试图通过所有这些具有重复属性名称的类来追逐一个属性值,并在后面的 DialogView 代码中使用this.onlineMapControl.zoomLevel = this.dialogViewModel.zoomLevel 等进入逻辑意大利面条。这只是一个非常糟糕的代码气味.您如何处理类似于这样的设计,即视图中的复杂控件只能通过后面的代码访问并保持 MVVM 模式完整?
【问题讨论】:
-
如果没有任何代码可以准确显示问题所在,很难评论。听起来您的地图控件应该为
ZoomLevel之类的东西公开各种依赖属性,然后您只需将它们绑定到DialogView中的DialogViewModel。 -
mvvm != 没有代码隐藏。 UI 逻辑应该在你的 UI 中。