打开新窗口并使用mvvm将集合传递给viewmodel

时间:2017-02-07 05:27:13

标签: asp.net wpf silverlight mvvm

我有一个视图,其中包含一个按钮,当我点击我要打开窗口,其中我想将可观察的集合传递给新窗口的viewmodel打开。我使用下面的代码它是工作但我不确定它是不是mvvm模式。

ViewCode:

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&amp;视图模型。     请让我知道你的想法

2 个答案:

答案 0 :(得分:0)

在viewmodel中创建一个新窗口紧密地耦合了View和ViewModel层,这违背了MVVM的目的。

此外,您不应该在视图中拥有业务数据,而是在ViewModel中,即使使用对话框也是如此。

您将看到一些MVVM框架正在为Model,View或ViewModel无法(轻松)管理的所有内容实现服务类。显示对话框就是其中之一。

我将使用Catel的示例进行演示。 Catel提供了一个IUIVisualizerService接口,您可以在viewmodel的构造函数中注入:

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

要打开一个新对话框,由于Catel内部匹配视图和视图模型,您可以简单地创建对话框的viewmodel并解析相应的视图。这样,您可以根据需要将数据传递给viewmodel的构造函数:

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

答案 1 :(得分:0)

您可以创建一个窗口服务,负责打开窗口,然后使用这样的服务注入您的视图模型。然后,您可以调用服务的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);
    }
}

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