调用不同模块的WPF PRISM对话框窗口

时间:2015-12-19 17:28:30

标签: wpf shell navigation prism

我有一个带有区域的WPF PRISM应用程序 - 菜单区域和工作区域。单击菜单时,在工作区区域内打开相应的视图/表单。我有不同的模块,如员工,组织,财务等......每个模块都有多个视图/表单。

当点击员工视图/表单(Module - Employee)中的按钮时,我需要从Finance模块打开视图/表单作为对话框窗口。

有没有办法在PRISM中实现同样的目标?

[编辑1]: 2个模块是独立模块。我不希望将Finance模块的引用添加到Employee模块。进一步向下我可能需要将Employee显示为来自一个或多个财务视图的对话窗口。

1 个答案:

答案 0 :(得分:1)

当然 - 这里有两种方法供您考虑。

选项1

Prism的documentation有一个关于"在全球范围内提供命令的部分"使用他们的 CompositeCommand 类。为此,请在两个程序集都可以引用的公共库中创建公共静态类:

public static class GlobalCommands
{
    public static CompositeCommand ShowFinanceFormCommand = new CompositeCommand();
}

在财务表单视图模型中,您将注册实际命令(具有显示表单的所有逻辑):

public FinanceViewModel()
{
    GlobalCommands.ShowFinanceFormCommand.RegisterCommand(this.ShowFinancePopupCommand); 
}

在员工视图模型中,将按钮的ICommand绑定到ShowFinanceFormCommand复合命令。

public EmployeeViewModel()
{
    this.EmployeeShowFinanceFormCommand = GlobalCommands.ShowFinanceFormCommand;
}

选项2

如果您需要以松散耦合的方式跨模块广播事件,请使用Prism的 EventAggregator 类。要实现此功能,请在可以引用的公共程序集中创建ShowFinanceFormEvent。在employee viewmodel中,按下按钮时发布事件。在财务视图模型中,订阅该事件并做出相应的反应。

// This sits in a separate module that both can reference
public class ShowFinanceFormEvent : PubSubEvent<object>
{
}

public class EmployeeViewModel
{
    private readonly IEventAggregator eventAggregator;

    public EmployeeViewModel(IEventAggregator eventAggregator)
    {
        this.ShowFormCommand = new DelegateCommand(RaiseShowFormEvent);
        this.eventAggregator = eventAggregator;
    }

    public ICommand ShowFormCommand { get; }

    private void RaiseShowFormEvent()
    {
        // Notify any listeners that the button has been pressed
        this.eventAggregator.GetEvent<ShowFinanceFormEvent>().Publish(null);
    }
}

public class FinanceViewModel
{
    public FinanceViewModel(IEventAggregator eventAggregator)
    {
        // subscribe to button click events
        eventAggregator.GetEvent<ShowFinanceFormEvent>().Subscribe(this.ShowForm);

        this.ShowFinanceFormRequest = new InteractionRequest<INotification>();
    }

    public InteractionRequest<INotification> ShowFinanceFormRequest { get; }

    private void ShowForm(object src)
    {
        // Logic goes here to show the form... e.g.
        this.ShowFinanceFormRequest.Raise(
            new Notification { Content = "Wow it worked", Title = "Finance form title" });
    }
}