我想请教你。
我正在处理的应用程序有一个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,我对如何实现不同的剪切/复制/粘贴功能一无所知。
我为问题的长度道歉。也许我可以问:
“如何根据选择/激活的应用程序部分将不同的剪切/复制/粘贴命令绑定到按钮上?”。
但我觉得我想要实现的目标的附加背景将有助于回答这个问题。
答案 0 :(得分:2)
并且SaveFile()方法会调用其他一些“保存方法” 所选标签的datacontext(它将是一个视图模型) 根据“文件”类型)。
SaveFile应该由ViewModel实现,而不必返回View。
创建几个ViewModel来表示不同类型的文档,并让每个文档实现其Save功能。
View可以使用命令的CanExecute方法来决定是否应该启用菜单项或按钮。您所需要的只是在ViewModel中实现CanExecute方法。在大多数情况下,Save命令的CanExecute将使用IsDirty或类似属性。
修改强>
对于应该是上下文/活动标签项感知的菜单项,您可以创建一个主ViewModel,其中包含菜单命令和ViewModel集合(每个标签项一个)
在上下文感知菜单项的命令处理程序中获取活动的ViewModel并传递命令。
要获取当前TabItem,请将SelectedItem绑定到主ViewModel的属性(属性的类型可以是ViewModel的基类)。
这样您就不需要返回View来获取当前标签项。