2012-02-29 70 views
3

我有一個用戶控件中有一些telerik控件。我有一個編碼的所有業務邏輯所在的視圖模型。我需要攔截Leftbuttondown事件,以瞭解用戶何時單擊telerik控件。我嘗試使用MouseBinding技術將Leftbuttondown綁定到viewmodel中的事件處理程序。我不確定事件處理程序的簽名是什麼。我從某處讀取要綁定的命令應該是ttype ICommand,而Execute方法只需要一個參數。 爲Leftbuttondown事件的簽名是像通過MouseBinding連接鼠標事件與ViewModel

public void SelectItem(object o, EventArgs e) 

如何傳遞額外的參數來執行?

我已經做在XAML下面的編碼

<telerik:RadTransitionControl.InputBindings> 
     <MouseBinding Gesture="LeftClick" Command="SelectedItem" /> 
    </telerik:RadTransitionControl.InputBindings> 

我應該如何定義視圖模型中的SelectedItem?

將給Command =「SelectedItem」的工作?或者我應該在這裏添加綁定子句?

在此先感謝

回答

2

的問題是,MouseBinding的命令屬性不是一個DependencyProperty,所​​以你不能綁定什麼東西。

在這裏看到了類似的問題:

If we can't bind a MouseBinding's Command, what are we supposed to do?

基本上,依照公認的回答這個問題,你必須使用AttachedCommandBehavior而非MouseBinding達到你想要的東西。在我看來,如果這是你做了很多事情,那將是最好的方式。

另外,如果這是你的代碼中唯一的情況,你這樣做,我不認爲這會傷害處理代碼後面的事件,並從那裏調用視圖模型的命令。 MVVM純粹主義者可能不同意,但有時候最好以簡單的方式來做事情,而不是把自己束縛在試圖讓代碼完全空白的節點上!

+0

根據您要鏈接的問題的另一個答案,該命令現在是** .NET 4 **中的一個DependencyProperty。 – Deantwo 2017-09-12 12:52:40

1

指令值應該是有約束力的,不只是一個屬性名稱:

<MouseBinding Gesture="LeftClick" Command="{Binding SelectedItem}" CommandParameter="..." /> 

那麼無論你傳遞到CommandParameter將被傳遞到執行額外的參數。

+0

我收到一個錯誤「A'Binding'不能在'MouseBinding'類型的'Command'屬性上設置。'Binding'只能在DependencyObject的DependencyProperty上設置。 – logeeks 2012-02-29 10:20:28

+1

啊,道歉。我以爲你已經在視圖模型中設置了一個命令。您需要設置DelegateCommand類,如下所述:http://wpftutorial.net/DelegateCommand.html,然後綁定到名爲SelectedItemCommand的命令,該命令的類型爲DelegateCommand。 – 2012-02-29 10:33:06

+0

謝謝,但我已經有了ICommand派生類,並且當我將該類的一個對象綁定到MouseBinding時引發異常 – logeeks 2012-02-29 10:45:31

3

首先你需要某種實現System.Windows.Input.ICommand的RelayCommand。這將有助於你綁定。

XAML

<MouseBinding Gesture="LeftClick" Command="{Binding SelectedItemCommand}" /> 

視圖模型

class YourViewModel 
{ 
    public void SelectItem(object o) 
    {  } 

    private ICommand selectedItemCommand 
    public ICommand SelectedItemCommand 
    { 
    get 
    { 
     if(selectedItemCommand == null) 
     { 
      // RelayCommand will point to SelectItem() once mouse is clicked 
      selectedItemCommand = new RelayCommand(SelectItem); 
     } 

     return selectedItemCommand; 
    } 
    } 
}