WPF:在MVVM中管理Windows(打开,关闭等)?

Bor*_*ris 5 wpf mvvm

我已经在很多地方读到过它.大多数人都指的是这两个链接:

我不明白他们中的任何一个.对于MVVM,我是初学者.有些人在MVVM中提到窗口操作时会提到控制器.这些是什么以及如何实施?通过本书,MVVM由模型,视图模型和视图组成 - 控制器在哪里进入?

如果有人可以提供以下用例的样本,那就太棒了(对于那些刚开始使用这个用户的人来说,就像我一样):

  1. 先决条件:打开一个窗口.
  2. 用户单击一个按钮.
  3. 打开新窗口,并将一些数据传递给该窗口,即一些字符串.
  4. 关闭新窗口(或单击按钮),并将一些数据传递到第一个窗口.
  5. 传递的数据改变了窗口上的内容.

Mar*_*ote 0

ViewModel 到 ViewModel 的通信通常由事件聚合器模式的实现来处理。

MVVM Light 使用该类Messenger,Prism 有另一种实现,但基本上这是在视图模型之间发送消息而无需耦合的一种方法。

有一些示例和描述用法的文章。我建议看一下。

关于WPF中的控制器的东西,我不知道。

关于这个例子:

-我有一个带有 WindowsViewModel 的 Windows。此类应该有一个绑定到按钮的命令。

- 用户单击按钮。执行命令。

- 该命令打开一个新窗口。

在这里,您应该创建对话框视图模型,并以某种方式创建窗口。或者使用 ViewModel 创建 Window,但 ViewModel 不应该对 View 了解太多,否则无法测试。

我们使用这样的东西是因为我们有一些要求,但它可能要简单得多,碰巧这是我手头唯一的例子:

bool? ShowDialogImpl<TViewModel>(Action<TViewModel> setup) where TViewModel : ViewModel
{
    return (bool?)DispatcherHelper.UIDispatcher.Invoke(
        (Func<bool?>)(() =>
        {
            var viewModel = viewModelFactory.Get<TViewModel>();
            viewModel.ViewService = this;
            setup(viewModel);
            var window = new Window
            {
                Owner = this,
                SizeToContent = SizeToContent.WidthAndHeight,
                WindowStartupLocation = WindowStartupLocation.CenterOwner,
                Content = ViewFactory.CreateView<TViewModel>(),
                DataContext = viewModel,
                WindowStyle = WindowStyle.ToolWindow,
                ShowInTaskbar = false
            };
            window.SetBinding(TitleProperty, new Binding("Title"));
            openDialogs.Push(window);
            window.Activated += (sender, args) => window.SizeToContent = SizeToContent.Manual;
            var result = window.ShowDialog();
            openDialogs.Pop();
            viewModelFactory.Release(viewModel);
            return result;
        }));
}
Run Code Online (Sandbox Code Playgroud)

基本上:我们创建一个窗口和一个视图模型。视图模型是使用容器从工厂创建的。设置操作委托是我们数据的入口点。

  • 沟通:

第一个窗口是一个网格,第二个对话框用于编辑网格的数据。如果我们有 Windows:

messenger.Register<EntityUpdated<FooClass>>(this, message => UpdateItem(message.Entity));
Run Code Online (Sandbox Code Playgroud)

在对话框中:

messenger.Send(new EntityUpdated<FooClass>(subject));
Run Code Online (Sandbox Code Playgroud)

这样,我们就知道编辑对话框中的某些内容何时更新以刷新网格。

希望这对您有帮助:)