2012-07-12 19 views
4

这是我的应用程序架构。请注意,我有导体作为另一位指挥的孩子。我有IHandle让每个售票员从它的孩子那里接收消息。消息类型与我用于导航的消息相同。我的问题是我将ShellView的EventAggregator传递给它的子节点。带导体和事件聚合器的分层导航

NewConnectionView的EventAggregator怎么样?因为我使用它的EventAggregator在ShellView上进行导航。因为它是儿童导航它的ActiveItem。

如何在一个ViewModel中分离这2个EventAggregators。

ShellView & NewConnectionView ==> Conductor.Collection.OneActive

          +----------------------------------+ 
             | 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| 
+----------------------------------+ +----------------------------------+ 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
|         | |         | 
+----------------------------------+ +----------------------------------+ 
+0

对于ASCII艺术的+1 – juFo 2013-10-08 11:45:40

回答

0

这听起来像你要使用的事件聚合壳/插件进行通信的一个实例,每一个插件实例视图模型间的沟通。我建议使用两个IoC容器并将shell事件聚合器注册为单例,然后使用引用容器的工厂来解析视图模型的实例。

您可以拥有一种消息类型,它可以更改显示名称并在shell视图事件聚合器实例上发布,还可以有一种消息类型更改当前活动项目并在所有事件聚合器实例上使用。

+0

使用IoC意味着我也使用MEF吗? – asakura89 2012-07-16 09:44:08

+0

或ninject,autofac等MEF有点不同! .NET书中的Dependancy Injection很好地描述了这些差异。 – 2012-07-17 04:32:04

+0

是的,没有什么可以阻止您使用MEF为您的插件体系结构,而另一个IoC容器则用于您的常规应用程序基础结构。 – devdigital 2012-07-17 08:25:26