【问题标题】:Code behind control with MVVM pattern?使用 MVVM 模式进行控制的代码?
【发布时间】: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 中。

标签: c# wpf mvvm


【解决方案1】:

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

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

从那时起,DialogView XAML 应该使用数据绑定并且本身不应该有任何代码隐藏,因此在它和 DialogViewModel 之间复制任何数据成为一个有争议的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 2011-11-25
    • 2020-10-18
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多