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

时间:2011-04-07 16:04:19

标签: wpf mvvm

我在很多地方都读过这篇文章。大多数人都指的是这两个链接:

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

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

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

2 个答案:

答案 0 :(得分:0)

ViewModel到ViewModel的通信通常由Event Aggregator模式的实现来处理。

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

有一些示例,Articles描述了用法。 我建议看看它。

关于WPF中的控制器内容,我不知道。

关于示例:

-I有一个带有WindowsViewModel的Windows。这个类应该有一个绑定到Button的命令。

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

-The Command打开一个新窗口。

在这里你应该创建对话视图模型,不知何故你应该创建窗口。或者使用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;
                              }));
        }

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

  • 通讯:

第一个Windows是Grid,第二个是编辑网格数据的Dialog。 在我们的Windows中:

messenger.Register<EntityUpdated<FooClass>>(this, message => UpdateItem(message.Entity));

在对话框中:

messenger.Send(new EntityUpdated<FooClass>(subject));

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

希望这可以帮助你:)

答案 1 :(得分:0)

如果您不打算允许用户在窗口之间来回切换,而两者都打开(即,第一个打开第二个,第二个必须关闭以返回到第一个),你可以只需将两个窗口的viewmodel设置为同一个viewmodel实例,然后将第二个窗口打开为模态,并且来回传递的字符串将只是视图模型的属性,数据绑定到视图中的某些内容。 / p>