Prism/MVVM(MEF/WPF):从模块公开导航[例如菜单]

Mar*_*ins 12 navigation wpf prism mef

我开始第一次尝试使用MEF和WPF进入Prism v4/MVVM的世界.我成功构建了一个shell,使用MEF,我能够发现并初始化模块.但是,我不确定为这些模块公开的视图提供导航的正确方法.

例如,假设其中一个模块公开了三个视图,我想在菜单控件上显示这些视图的导航.到目前为止,我已经成功地暴露了一个基于a的视图,MenuItem并且它MenuItem包含子MenuItem控件,因此提供了可以使用的命令层次结构.大.

事情是,这感觉不对.我现在在我的模块中说明导航(因此shell)必须支持使用菜单.如果我想换到使用ToolBar,甚至一个Ribbon.然后我必须更改所有模块以显示shell的相应控件类型.

我环顾四周,有些网站提到使用"服务"来提供导航,在模块初始化期间,导航选项被添加到服务中,而服务又被shell用来显示导航格式就是了(ToolBar,TreeView,Ribbon,MenuItem等) -但我不能找到真正做任何的例子.

为了全面了解这一点,我最终希望能够从菜单和/或其他导航控件(可能是a Ribbon)中选择视图,然后在TabControl中按需打开这些视图.我已经得到了能够在TabControlat模块初始化时创建视图,现在我需要下一步.

我需要知道的是:以这样的方式公开导航选项的正确方法是什么,而不是坚持支持shell的特定控件,如果服务是方式,那么如何放置这一点在Prism/MVVM模式中.

提前感谢您提供的任何见解.

San*_*ock 7

我想你有一个包含通用接口的主模块.你可以创建一个简单的界面

public interface IMenuService {
    void AddItem(string name, Action action);
    IEnumerable<MenuItemViewModel> GetItems { get; }
}
Run Code Online (Sandbox Code Playgroud)

创建1个实现和单个实例.

public class MenuService : IMenuService {

    private readonly IList<MenuItemViewModel> items = new List<MenuItemViewModel>();

    void AddItem(string name, Action action) {
        items.Add(new MenuItemViewModel {
            Name = name,
            Action = action
        });
    }

    IEnumerable<MenuItemViewModel> GetItems {
        get { return list.AsEnumerable(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的模块中,使用MEF解析此实例并调用AddItem()以注册您的视图.该Action属性是一个简单的委托,用于激活视图或执行任何其他操作.

然后在shell或任何视图中,您只需要调用GetItems属性来填充菜单.