加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:16:20 所属栏目:Windows 来源:网络整理
导读:我已经在很多地方读到过它.大多数人都指的是这两个链接: How do I handle opening and closing new Windows with MVVM? http://waf.codeplex.com/ 我不明白他们中的任何一个.对于MVVM,我是初学者.有些人在MVVM中提到窗口操作时会提到控制器.这些是什么以及
我已经在很多地方读到过它.大多数人都指的是这两个链接:

> How do I handle opening and closing new Windows with MVVM?
> http://waf.codeplex.com/

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

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

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

解决方法

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

MVVM Light使用Messenger类,Prism有另一种实现,但基本上这是在没有耦合的情况下在View Models之间发送消息的一种方法.

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

关于WPF中的控制器,我不知道.

关于这个例子:

– 我有一个带有WindowsViewModel的Windows.这个类应该有一个绑定到Button的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));

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

希望这对你有所帮助:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读