我有一个带有区域的WPF PRISM应用程序 - 菜单区域和工作区域。单击菜单时,在工作区区域内打开相应的视图/表单。我有不同的模块,如员工,组织,财务等......每个模块都有多个视图/表单。
当点击员工视图/表单(Module - Employee)中的按钮时,我需要从Finance模块打开视图/表单作为对话框窗口。
有没有办法在PRISM中实现同样的目标?
[编辑1]: 2个模块是独立模块。我不希望将Finance模块的引用添加到Employee模块。进一步向下我可能需要将Employee显示为来自一个或多个财务视图的对话窗口。
答案 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" });
}
}