【问题标题】:open new window and pass collection to viewmodel using mvvm打开新窗口并使用 mvvm 将集合传递给 viewmodel
【发布时间】:2017-06-24 06:08:25
【问题描述】:

当我单击时,我有一个由按钮组成的视图是否是 mvvm 模式。

查看代码:

NewWindow newWindowDialog;
newWindowDialog = new NewWindow()
{
    newWindowDialogCollection = suppliersList,
    Owner = Application.Current.MainWindow
};
newWindowDialog.ShowDialog();

NewWindow 对话框代码:

public partial class NewWindow : Window
{
    public NewWindow()
    {
        InitializeComponent();
        newWindowDialogCollection = new ObservableCollection<SModel>();
        DataContext = this;
    }
    public ObservableCollection<ISupplierModel> newWindowDialogCollection { get; set; }
}

在 xaml 中“newWindowDialogCollection”充当我的数据源进行绑定

但我不确定上述方法是否是暗示打开新窗口并通过收集的正确方法。我想通过纯 mvvm 和 viewmodel 来做到这一点。 请告诉我你的想法

【问题讨论】:

    标签: asp.net wpf silverlight mvvm


    【解决方案1】:

    在视图模型中创建一个新窗口将视图和视图模型层紧密耦合,这违背了 MVVM 的目的。

    此外,您不应该在 View 中包含业务数据,而是在 ViewModel 中,即使有对话框也是如此。

    您将看到一些 MVVM 框架所做的是为模型、视图或 ViewModel 无法(轻松)管理的所有内容实现服务类。显示对话框就是其中之一。

    我将使用 Catel 的例子来演示。 Catel 提供了一个IUIVisualizerService 接口,您可以将其注入到视图模型的构造函数中:

    public MyViewModel(IUIVisualizerService visualizerService)
    {
         this._visualizerService = visualizerService;
    }
    

    并且要打开一个新对话框,因为 Catel 内部匹配视图和视图模型,您只需创建对话框的视图模型并解析适当的视图。这样,您可以随意将数据传递给视图模型的构造函数:

    var viewModel = new MyViewModel(suppliersList);
    _visualizerService.Show(viewModel);
    

    【讨论】:

      【解决方案2】:

      您可以创建一个负责打开窗口的窗口服务,然后将此类服务注入您的视图模型。然后调用服务的 ShowWindow 方法从视图模型中打开窗口,例如:

      服务:

      public interface IWindowService
      {
          void ShowWindow(ObservableCollection<string> collection);
      }
      
      public class WindowService : IWindowService
      {
          public void ShowWindow(ObservableCollection<string> collection);
          {
              NewWindow newWindowDialog = new NewWindow()
              {
                  newWindowDialogCollection = collection,
                  Owner = Application.Current.MainWindow
              };
              newWindowDialog.ShowDialog();
          }
      }
      

      查看模型:

      public class ViewModel
      {
          private readonly IWindowService _service;
          public ViewModel(IWindowService service)
          {
              _service = service;
          }
      
          //...
          public void OpenCommandExecuted()
          {
              _service.ShowWindow(_theCollectionToPass);
          }
      }
      

      使用这种方法,视图模型只知道一个接口,您可以通过提供接口的模拟实现来轻松进行单元测试,而无需实际打开窗口。

      【讨论】:

      • 这一行 newWindowDialogCollection = collection 怎么样,我需要在窗口代码中使用“newWindowDialogCollection”,因为主要目的是现在集合如何进入新窗口..
      • 将集合的引用传递给 ShowWindow 方法,并在 WindowService 类中将 NewWindow 或其视图模型的属性设置给该集合。
      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2015-01-20
      • 2012-10-24
      • 2013-11-11
      • 2012-09-10
      • 2016-02-22
      • 1970-01-01
      相关资源
      最近更新 更多