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模式中.
提前感谢您提供的任何见解.
我想你有一个包含通用接口的主模块.你可以创建一个简单的界面
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属性来填充菜单.
| 归档时间: |
|
| 查看次数: |
8336 次 |
| 最近记录: |