【问题标题】:Event-based communication between "sibling" views“兄弟”视图之间基于事件的通信
【发布时间】:2019-03-06 11:26:45
【问题描述】:

我对 WPF 很陌生,所以我一直在为一些基本概念而苦苦挣扎。

我的应用程序由一个包含各种选项卡的主窗口组成。第一个选项卡用于添加文件,激活对给定文件进行操作的其他选项卡。为简单起见,我们称后者为“DataTabs”。

我不确定如何在选项卡之间正确通信。目前,FileInputTab 使用指定的 ICommand 执行以下操作:读取数据,为 DataTab 创建视图模型,并使用 FileInputTab 的视图引发“ViewModelReadyEvent”。

然后此事件冒泡到 MainWindow,它激活 DataTab 并将创建的 ViewModel 传递给它们。

现在,有两件事我正在努力解决。

填充视图模型 在其相应视图中填充 DataTab 的视图模型,而不是从实际上与之无关的 FileInputTab 填充视图模型是否更好?这样,我可以正确地在两者之间建立引用,但我必须为每个 DataTab 分别执行填充。有什么想法吗?

“兄弟”视图之间的通信 让事件一直冒泡到 MainWindow 以让它协调所有视图间通信是不对的。我查看了 RoutingStrategies,但找不到任何直接在“兄弟”视图之间进行通信的方法。我想在 FileInputTab 中引发一个事件并直接在 DataTabs 中对其进行操作,而无需任何中间。

WPF 专家的任何想法、cmets 或书籍推荐将不胜感激。提前致谢。

【问题讨论】:

  • 你应该使用 mvvm。将视图模型的列表或可观察集合绑定到选项卡控件项源。将它们模板化到选项卡中。如果你想在不同的对象之间进行通信,我推荐 mvvmlightlibs nuget 和 messenger。 social.technet.microsoft.com/wiki/contents/articles/…

标签: c# .net wpf mvvm


【解决方案1】:

使用 MVVM,您可以为每个选项卡引入一个 ViewModel。然后你可以为 ViewModel 之间的通信编写一个服务。如果您使用信使模式,这很容易。一个 ViewModel 向 Service 发送消息,Service 将消息转发到另一个 ViewModel。 Service 也会完成这项工作,因此您的 ViewModel 不会有任何业务逻辑。

MVVM Light 对 MVVM 模式有很大帮助。

【讨论】:

    【解决方案2】:

    您可以使用IEventAggregator 在 ViewModel 之间进行通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-08
      • 2017-05-04
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多