C# 带有指挥器和事件聚合器的分层导航
这是我的应用程序架构。请注意,我将导体作为另一个导体的孩子。我有IHandle让每个指挥接收来自其子指挥的消息。消息类型与我仅用于导航的消息相同。我的问题是我将ShellView的EventAggregator传递给它的孩子们 NewConnectionView的事件聚合器怎么样?因为我使用它的EventAggregator在ShellView上导航。它的孩子可以在它的ActiveItem上导航 如何在一个ViewModel中分离这两个EventAggregator ShellView&NewConnectionView==>Conductor.Collection.OneActiveC# 带有指挥器和事件聚合器的分层导航,c#,wpf,mvvm,caliburn.micro,eventaggregator,C#,Wpf,Mvvm,Caliburn.micro,Eventaggregator,这是我的应用程序架构。请注意,我将导体作为另一个导体的孩子。我有IHandle让每个指挥接收来自其子指挥的消息。消息类型与我仅用于导航的消息相同。我的问题是我将ShellView的EventAggregator传递给它的孩子们 NewConnectionView的事件聚合器怎么样?因为我使用它的EventAggregator在ShellView上导航。它的孩子可以在它的ActiveItem上导航 如何在一个ViewModel中分离这两个EventAggregator ShellView&NewC
+----------------------------------+
| ShellView |_|[]|x|
+----------------------------------+
| +------------------------------+ |
| | | |
| | | |
| | | |
| | ActiveItem | |
| | | |
| | | |
| | | |
| +------------------------------+ |
+----------------------------------+
/ \
/ \
/ \
/ \
/ \
/ \
/ \
+----------------------------------+ +----------------------------------+
| NewConnectionView |_|[]|x| | ConnectionListView |_|[]|x|
+----------------------------------+ +----------------------------------+
| +------------------------------+ | | TextBlock |
| | ComboBox | V | | | +----------------------+ +-----+ |
| +------------------------------+ | | | | | Btn | |
| +------------------------------+ | | | | +-----+ |
| | | | | | | +-----+ |
| | | | | | | | Btn | |
| | | | | | DataGrid | +-----+ |
| | ActiveItem | | | | | +-----+ |
| | | | | | | | Btn | |
| | | | | | | +-----+ |
| | | | | | | |
| +------------------------------+ | | +----------------------+ |
+----------------------------------+ +----------------------------------+
/ \
/ \
/ \
/ \
/ \
/ \
/ \
+----------------------------------+ +----------------------------------+
| FileConnectionView |_|[]|x| | DatabaseConnectionView |_|[]|x|
+----------------------------------+ +----------------------------------+
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------------------------------+ +----------------------------------+
目前,我的方法是使用NewConnectionShellView(屏幕)作为NewConnectionView的(导体)父对象来分离EventAggregator。但问题是,我无法将NewConnectionView的子项的DisplayName显示在我的主窗口(ShellView)中
请注意,我没有使用MEF。我的问题有解决办法吗
+----------------------------------+
| ShellView |_|[]|x|
+----------------------------------+
| +------------------------------+ |
| | | |
| | | |
| | | |
| | ActiveItem | |
| | | |
| | | |
| | | |
| +------------------------------+ |
+----------------------------------+
/ \
/ \
/ \
/ \
/ \
/ \
/ \
+----------------------------------+ +----------------------------------+
| NewConnectionShellView |_|[]|x| | ConnectionListView |_|[]|x|
+----------------------------------+ +----------------------------------+
| +------------------------------+ | | TextBlock |
| | | | | +----------------------+ +-----+ |
| | | | | | | | Btn | |
| | | | | | | +-----+ |
| | | | | | | +-----+ |
| | | | | | | | Btn | |
| | | | | | DataGrid | +-----+ |
| | ActiveItem | | | | | +-----+ |
| | | | | | | | Btn | |
| | | | | | | +-----+ |
| | | | | | | |
| +------------------------------+ | | +----------------------+ |
+----------------------------------+ +----------------------------------+
|
|
|
|
|
|
|
|
V
+----------------------------------+
| NewConnectionView |_|[]|x|
+----------------------------------+
| +------------------------------+ |
| | ComboBox | V | |
| +------------------------------+ |
| +------------------------------+ |
| | | |
| | | |
| | | |
| | ActiveItem | |
| | | |
| | | |
| | | |
| +------------------------------+ |
+----------------------------------+
/ \
/ \
/ \
/ \
/ \
/ \
/ \
+----------------------------------+ +----------------------------------+
| FileConnectionView |_|[]|x| | DatabaseConnectionView |_|[]|x|
+----------------------------------+ +----------------------------------+
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------------------------------+ +----------------------------------+
听起来您希望使用事件聚合器的一个实例进行shell/插件通信,每个插件使用一个实例进行视图间模型通信。我建议使用IoC容器并将shell事件聚合器注册为单例,然后使用引用容器的工厂来解析视图模型的实例
您可以有一种更改显示名称并发布在shell view事件聚合器实例上的消息类型,以及一种更改当前活动项并用于所有事件聚合器实例的消息类型。使用IoC意味着我也使用MEF?或ninject、autofac等。MEF有点不同!NET书籍中的依赖性注入很好地描述了这些差异。是的,没有什么可以阻止您在插件架构中使用MEF,在通用应用程序基础架构中使用另一个IoC容器。