如何在 MVVM AvalonDock 程序中使用 ApplicationCommands?

How to use ApplicationCommands in a MVVM AvalonDock Program?

我正在开发一个使用 AvalonDock 同时打开多个文档的程序。还有一个 public 功能区,顶部有一些常用按钮,如下所示:

现在,Cut, Copy, Paste, Delete可以通过在ContextMenu中点击它们的MenuItem来使用。

但是,当我想将这些命令绑定到功能区中的按钮时,出现了一些问题。

模仿AvalonDock的例子,我的XAML是

 <DockingManager DocumentsSource="{Binding Documents}" ActiveContent="{Binding ActiveDocument,Mode=TwoWay}">
    <DockingManager.LayoutItemTemplateSelector>
        <local:PanesTemplateSelector>
            <local:PanesTemplateSelector.ShapesDocumentTemplate>
                <DataTemplate>
                    <view:ShapesDocument/>
                </DataTemplate>
            </local:PanesTemplateSelector.ShapesDocumentTemplate>
        </local:PanesTemplateSelector>
    </DockingManager.LayoutItemTemplateSelector>
 </DockingManager>

而我的 C# 是:

public ObservableCollection<ShapesDocumentViewModel> Documents { get; set; } = new ObservableCollection<ShapesDocumentViewModel>();

所以 ActiveDocumentViewModel

在我的 ShapesDocument 中,有一个 CanvasExCut_Executed,Copy_Executed...

那么,如何绑定 CommandTarget?或者有一些方法可以将 Executed 移动到 ViewModel 中?

<Button Command="{x:Static ApplicationCommands.Cut}" CommandTarget="{Binding ???}"/>

我暂时用MenuItems来替换按钮。我在 ShapeDocument UserControl 中的控件中设置了 ApplicationCommands,并将它们绑定到 MenuItems 而不设置命令目标。

我猜WPF可以自动搜索菜单项的目标,但不能自动搜索按钮。所以我可以将它们更改为 MenuItems,并将 MenuItems 的样式更改为模仿按钮。

不是很优雅,但是很方便,代码也很简单。