WPF将不同的命令绑定到button / menuitem

时间:2013-07-01 13:20:48

标签: c# wpf mvvm binding command

我想请教你。

我正在处理的应用程序有一个docking control,应该支持使用不同的“文档”。因此,可以同时打开多个windows(制表符)。

每个人都可以托管不同的内容。我提到的“文件”可以是文本文件, 一个excel样式表或正在开发此应用程序的主要控件(地理数据可视化)。

我正在使用MVVM模式和MVVM Light库。注意:我有excel电子表格的第三方控件。

现在我有一个menu bar和一个toolbar,其中我有menuitems个(menubar}个/按钮(在toolbar中),例如'save' ,'剪切','复制'等...当您在标签之间切换时,“保存”按钮应调用相应的保存功能。

切割/复制/粘贴也是如此:

  • 在带有文本文档的选项卡中 - 剪切/复制/粘贴应该使用文本操作(有wpf内置命令)。

  • 在主控制中 - 它应该与图形元素一起使用(我将不得不实现这些)

  • 在电子表格中 - 它应该与电子表格控件的随附第三方命令一起使用。

此外,可以有一个选项卡,其中选择了一些文本 - 因此切换/复制的菜单项/按钮应该在切换到此选项卡时启用,而其他一些选项卡没有选择图形元素,因此菜单项/按钮用于切割切换到此选项卡时应禁用/ copy。

使用save command我可以想象一种可能的方法,但是,我仍然不确定它是否是一种实现它的好方法:在MainWindowViewModel中有一个RelayCommand

public ICommand SaveCommand
{
    get
    {
        if (_saveCommand == null)
        {
            _saveCommand = new RelayCommand(() => this.SaveFile());
        }
        return _saveCommand;
    }
}

并且SaveFile()方法会在datacontext标签的selected上调用其他“保存方法”(这将是相应“文档”类型的视图模型)。 / p>

但是我不知道如何启用/禁用保存按钮/ menuitem,我对如何实现不同的剪切/复制/粘贴功能一无所知。

我为问题的长度道歉。也许我可以问:

“如何根据选择/激活的应用程序部分将不同的剪切/复制/粘贴命令绑定到按钮上?”。

但我觉得我想要实现的目标的附加背景将有助于回答这个问题。

1 个答案:

答案 0 :(得分:2)

  

并且SaveFile()方法会调用其他一些“保存方法”   所选标签的datacontext(它将是一个视图模型)   根据“文件”类型)。

SaveFile应该由ViewModel实现,而不必返回View。

创建几个ViewModel来表示不同类型的文档,并让每个文档实现其Save功能。

View可以使用命令的CanExecute方法来决定是否应该启用菜单项或按钮。您所需要的只是在ViewModel中实现CanExecute方法。在大多数情况下,Save命令的CanExecute将使用IsDirty或类似属性。

修改

对于应该是上下文/活动标签项感知的菜单项,您可以创建一个主ViewModel,其中包含菜单命令和ViewModel集合(每个标签项一个)

在上下文感知菜单项的命令处理程序中获取活动的ViewModel并传递命令。

要获取当前TabItem,请将SelectedItem绑定到主ViewModel的属性(属性的类型可以是ViewModel的基类)。

这样您就不需要返回View来获取当前标签项。