2012-02-27 56 views
1

通過複製/粘貼等標準WPF命令,他們似乎都可以使用一個按鈕並在文本框上執行操作。我的問題:當我有一個按鈕時,如何使用命令,但我需要在兩個單獨的控件(文本框和組合框)中設置數據。如果用戶在文本框中編寫了文本,但未選擇組合框值,則CanExecute應該失敗。這適用於已設置組合框但不包含文本框的情況。作用於兩個控件的命令

在我的情況下,所有這些控件都包裝在一個tabitem中。另外,我還有另一個只有文本框和按鈕的選項卡。我希望它具有與第一個選項卡相同的功能,除了檢查組合框值以外,它應檢測到沒有組合框並傳入默認的「空對象」值。

Execute方法應該在我的viewmodel中調用一個方法,並從combobox和textbox傳入值。同樣,每個選項卡應該傳遞另一個唯一的靜態值;我想我可以使用commandparameter來處理這個問題。

我該如何做這項工作?我是否可以在can/execute方法中將父標籤作爲commandtarget並直接引用其子控件?

+0

文本框僅僅是一個壞榜樣。即使WPF有很多「預定義」的命令,如ApplicationCommands中的命令。其中沒有任何事情。它只是爲了命名和給命令一個捷徑。恰巧TextBox已經實現了這些命令。這就是你需要做的,爲你想要的命令提供一個Execute和CanExecute Handler。檢查命令綁定的msdn。 – dowhilefor 2012-02-27 21:37:06

+0

嘿dowhilefor,感謝您的提示,但我已經熟悉一般命令的概念,我只需要幫助我的特定情況,我從來沒有見過: 1.如何執行命令時,他們的工作兩個控件(每個示例僅適用於來自一個控件的輸入)。我提出了我提出的解決方案,但它涉及(直接)引用一個控件,這聽起來像一個糟糕的主意。 2.解決問題1後,如何區分提供相同功能的兩個選項卡? – FZdev 2012-02-27 21:54:26

+0

通常在當前焦點的控件上觸發命令。因此,即使您有兩個文本框,它們也會分別處理撤銷命令,具體取決於焦點所在的位置。你是這個意思嗎? – dowhilefor 2012-02-27 22:02:02

回答

0

您需要實現CanExecute方法來檢查TextBox數據綁定值和ComboBox.SelectedItem數據綁定值。

以您的問題爲例。

您的TextBox.Text應該是數據綁定到您的ViewModel 以及您的組合框。 所以,你的ViewModel應該有兩個屬性:

public string TextBoxCurrentText {get { ...}set {...}} 
public string ComboBoxCurrentSelected {get { ...}set {...}} 

然後在這兩個二傳手,你會做你的YourCommmand.RaiseCanExecuteChanged();

所以它會執行你的CanExecute代碼塊來決定可以將您的按鈕點擊。 有以下幾種:

bool YourCommandCanExecute() 
    { 
//Just example 
     if (!string.IsNullOrEmpty(TextBoxCurrentText) && !string.IsNullOrEmpty(ComboBoxCurrentSelected)) 
      return true; 
     return false; 
    } 
+0

我不確定這個地址是一個關鍵問題:如果我在第一個選項卡中編寫文本並設置組合框值,但不要提交,那麼去到第二個標籤並寫入更多文本並提交。我的viewmodel如何認識到它是第二個標籤?畢竟,組合框值仍然設置。 – FZdev 2012-02-27 21:52:31

+0

@FZdev我不知道你是如何實現你的View和ViewModel的。如果每個Tab都是View並且每個View數據綁定到不同的ViewModel,那麼您的ViewModel中定義的命令將僅檢查該ViewModel中的數據綁定值。即View1數據綁定到ViewModel1,View2數據綁定到ViewModel2。 View1不會影響ViewModel2的工作方式。 – 2012-02-27 21:58:37

+0

我只是用兩個tabitems來定義一個tabcontrol。在每個tabitem中,我放入文本框,按鈕和(在一種情況下)帶有靜態定義項目的組合框。 有一個viewmodel具有你推斷的兩個屬性(從以前的解決方案的嘗試,但他們仍然存在,我沒有使用它們的問題) 真的沒什麼特別的。多個選項卡只是一個特定的實現,我在初始設計時沒有考慮過,但我希望看到什麼樣的解決方案可以作爲學習練習。 – FZdev 2012-02-27 22:01:37