我有一个视图,其中包含一个按钮,当我点击我要打开窗口,其中我想将可观察的集合传递给新窗口的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;视图模型。 请让我知道你的想法
答案 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);
}
}
使用这种方法,视图模型只知道一个接口,通过提供接口的模拟实现,您可以轻松地进行单元测试,而无需实际打开窗口。