如何从viewmodel中触发在视图中调用对象的方法

时间:2016-04-27 19:50:36

标签: c# wpf mvvm

我的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一个视图引用?

1 个答案:

答案 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");
}

您可以将自己的功能添加到视图中,以确定哪一个当前处于活动状态,并应对该事件采取行动。