【问题标题】:How can I trigger calling a method on an object in my view from within the viewmodel如何从视图模型中触发对视图中对象的方法调用
【发布时间】:2016-04-27 19:50:36
【问题描述】:

我的 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 中创建命令是没有意义的,代码隐藏中的单击事件处理程序就可以了。如果您对 ViewModel 命令有信心,那么您可以使用事件/消息传递模式,例如 Prism EventAggregator。
  • 问题是我在第一部分试图解释的,按钮本身与需要调用此方法的视图完全分开,命令实际上是唯一的选择
  • @GlenThomas 我已经添加了一些解释,希望能解决这个问题
  • 我想我知道它是如何工作的。您的工具栏控件可以应用于任何窗口,具体取决于哪个窗口处于活动状态。听起来某种基于事件的模式会很好。您是否使用任何 MVVM 框架,例如 Prism、MVVM Light、Caliburn 等。
  • 我正在使用 Prism 和 DevExpress 的 Mvvm 库的组合,工具栏是 DevExpress RibbonToolbar,我还使用了 IActiveAware 接口来注册在工具栏中的命令。跨度>

标签: c# wpf mvvm


【解决方案1】:

Prism 有一个 EventAggregator 组件,用于在应用程序中的组件之间进行松散耦合的通信。

创建一个继承自CompositePresentationEvent 的类。泛型类型是您想要用作有效负载的任何数据的类型

public class ExportRequestedEvent : CompositePresentationEvent<object> { }

使用单例模式或您选择的 IoC 容器创建事件聚合器,以便在相关组件之间共享实例。

IEventAggregator _aggregator = new EventAggregator();

在命令中使用事件聚合器获取事件并发布

_aggregator.GetEvent<ExportRequestedEvent>().Publish(null);

在您看来,您可以注册一个方法来使用订阅方法处理事件

_aggregator.GetEvent<ExportRequestedEvent>().Subscribe(Export);

private void Export()
{
    grid.ExportToXlsx(@"c:\grid_export.xlsx");
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多