我的WPF应用程序有一个工具栏,其中包含几个按钮,默认情况下没有任何命令绑定。在应用程序中,可以打开各种不同的窗体/窗口(想想MDI),每个视图都负责使用共享实用程序注册它的任何命令,并将它们应用到工具栏按钮。
工具栏和其他标准UI片段与视图位于一个单独的库中,我提到的共享实用程序是视图挂钩到按钮的唯一界面。以下是视图如何注册命令的示例用法
public class MyView : BaseView
{
public MyView(CommandHolder commandHolder) : base(commandHolder)
{
SaveCommand = new DelegateCommand(Save,CanSave);
//RegisterCommand is a method on BaseView that works with the commandHolder object
RegisterCommand(DefaultCommands.SaveCommand, SaveCommand);
}
}
此功能适用于所有后端任务,例如保存和搜索,但现在我发现我需要能够从其中一个命令触发视图中存在的功能。
这里的具体示例是我的工具栏中有一个“导出到Excel”按钮,我当然希望根据网格中的数据生成xlsx文件。
我正在使用DevExpress控件,他们的网格支持以下方法调用:
//taken from xaml code behind
grid.ExportToXlsx(@"c:\grid_export.xlsx");
我的命令执行方法有没有办法能够触发此调用,只能给viewmodel一个视图引用?
答案 0 :(得分:1)
Prism有一个EventAggregator组件,用于在应用程序中的组件之间进行松散耦合的通信。
创建一个继承自CompositePresentationEvent
的类。泛型类型是您要用作有效负载的任何数据的类型
public class ExportRequestedEvent : CompositePresentationEvent<object> { }
使用Singleton模式或您选择的IoC容器创建事件聚合器,以便在相关组件之间共享实例。
IEventAggregator _aggregator = new EventAggregator();
在命令中使用事件聚合器来获取事件并发布
_aggregator.GetEvent<ExportRequestedEvent>().Publish(null);
在您的视图中,您可以使用Subscribe方法
注册处理事件的方法_aggregator.GetEvent<ExportRequestedEvent>().Subscribe(Export);
private void Export()
{
grid.ExportToXlsx(@"c:\grid_export.xlsx");
}
您可以将自己的功能添加到视图中,以确定哪一个当前处于活动状态,并应对该事件采取行动。