2013-07-01 69 views
0

我想问你一个建议。WPF将不同的命令绑定到按钮/ menuitem

我正在使用的应用程序有docking control,应支持使用不同的“文档”。因此可以同时打开多个windows(选项卡)。

每个可以承载不同的内容。我提到的“文档”可以是文本文件, 是Excel风格的表格或此应用程序正在开发的主要控件(地理数据可视化)。

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

现在我有一个menu bartoolbar在那里我有共同menuitems(在menubar)/按钮(在toolbar)像“保存”,“剪切”,“复制”等等...当你在标签之间切换,'保存'按钮应该调用相应的保存功能。

这同样适用于剪切/复制/粘贴:

  • 当与文本文档标签 - 剪切/复制/粘贴应该用文本操作(有WPF的内置命令为这个)。

  • 当主控制 - 它应与图形元素的工作(我将不得不实施这些)

  • 当电子表格 - 它应该与电子表格控制的封闭式第三方命令的工作。

此外,可以是具有选定的一些文本标签 - 用于剪切/复制从而菜单项/按钮时切换到这个标签应启用,而另一些卡具有这样选择的菜单项没有图形元素/切换到此选项卡时,应禁用剪切/复制的按钮。

随着保存command我能想象一个可能的方式做到这一点,不过,我不知道它是否是实现它的好方法:有一个在MainWindowViewModel

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

SaveFile()方法会在selected选项卡的datacontext(这将是相应的“文档”类型的视图模型)上调用其他“保存方法”。

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

对于问题的长度,我表示歉意。也许我可以问一下:

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

但我觉得我试图达到的附加背景将有助于回答这个问题。

+1

我会让MainViewModel拥有其他viewmodels的集合,并为当前选定的viewmodel添加一个属性。然后,save命令只是将调用转发给当前选定的viewmodels保存命令/方法。 – keft

回答

2

和SAVEFILE()方法将调用一些其它“保存方法”上 的datacontext所选标签(这将是用于 根据“文件”类型视图模型)的。

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

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

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

编辑

对于应当是上下文/活动标签项意识到你可以创建与菜单中的命令和的ViewModels的(为每个标签项目之一)的集合

主视图模型的菜单项

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

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

这样你就不需要回到视图来获取当前标签项。

+0

当一个视图的datacontext(选定的选项卡)是一个相应的视图模型(每种文档类型都有一种类型)时,我不明白代码将返回到视图的哪个位置?你什么意思?在视图模型中,我需要以某种方式找出哪个选项卡被选中。到目前为止我能做到的唯一方法是循环浏览集合(我持有一个引用)并找到选定的选项卡。但是你可能是对的,应该有另一种方法来找出当前选择的视图。你能否也帮我解答/复制问题的一部分?然后我可以将你的答案标记为已接受。 – kajovajo

+0

请参阅附加到我的答案。 –

+0

刚刚发现我使用的控件(Telerik对接)不支持SelectedItem(或类似于AvalonDock中的ActiveDocument)。 它有'对象SelectedContent'或'RadPane SelectedPane' - 我可以做 公共对象SelectedPane { 获得{...} 设置 { BaseViewModel VAR =(值作为用户控件).DataContext为BaseViewModel; } } 但我不知道这是你的想法。 – kajovajo