【发布时间】: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 接口来注册在工具栏中的命令。跨度>