wpf - Prism/MVVM (MEF/WPF) : Exposing navigation [Menu's for example] from modules

标签 wpf navigation prism mef

我开始使用 MEF 和 WPF 首次涉足 Prism v4/MVVM 世界。我已经成功构建了一个 shell,并且使用 MEF,我能够发现和初始化模块。但是,我不确定为这些模块公开的 View 提供导航的正确方法。

例如,假设其中一个模块公开了三个 View ,我想在菜单控件上显示到这些 View 的导航。到目前为止,我已经成功暴露了一个基于 MenuItem 的 View 。这个MenuItem包含 child MenuItem控制从而提供可以使用的命令层次结构。伟大的。

问题是,这感觉不对。我现在在我的模块中声明导航(以及外壳)必须支持使用菜单。如果我想改用 ToolBar 怎么办?甚至是 Ribbon .然后我将不得不更改我的所有模块以公开外壳的相应控件类型。

我环顾四周,在一些网站上提到了使用“服务”提供导航,在模块初始化期间,导航选项被添加到服务中,而该服务又被 shell 用来以任何方式显示此导航它想要的格式( ToolBarTreeViewRibbonMenuItem 等) - 但我找不到任何实际这样做的例子。

为了透视所有这些,我最终希望能够从菜单和/或其他导航控件(可能是 Ribbon)中选择 View ,然后在 TabControl 中按需打开这些 View 。我已经能够在 TabControl 中创建 View 了。在模块初始化时,现在我需要下一步。

我需要知道的是:什么是公开导航选项的正确方法,而不是坚持由 shell 支持特定控件,如果服务是要走的路,那么人们将如何放置这在 Prism/MVVM 模式中一起使用。

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

最佳答案

我想你有一个包含通用接口(interface)的主模块。
您可以创建一个简单的界面,例如

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

创建 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(); }
    }
}

在您的模块中,使用 MEF 解析此实例并调用 AddItem()登记您的意见。Action property 是一个简单的委托(delegate),用于激活 View 或执行任何其他操作。

然后在你的 shell 或任何 View 中,你只需要调用 GetItems属性来填充您的菜单。

关于wpf - Prism/MVVM (MEF/WPF) : Exposing navigation [Menu's for example] from modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178732/

相关文章:

c# - 为其设置模板时,我的 ListView 项目未显示

c# - 使用 MVVM 包含不同用户控件的 TabControls

c# - 从 wpf 应用程序打开并且 outlook 正在运行时,如何使 outlook 选择名称对话框聚焦

button - 使用 vaadin 避免后退按钮

c# - 在ViewModel中修改后,String属性在View中不会更新

wpf - 在 InvalidateVisual() 之后未调用 OnRender

WPF DataGrid 列宽

WPF:标签导航因折叠超链接而中断

android - 禁用滑动打开抽屉但不是关闭

c# - ClickOnce 部署应用程序的 Prism 架构注意事项