2013-07-01 70 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