2012-04-29 28 views
0

我在視圖中有一些重複代碼,它們是拖動&拖放操作的一部分。我在ViewModelBase上有一個ICommand,用於處理模型拖放操作所需的操作。因爲我試圖避免將UI事件參數傳遞給ViewModel,所以我需要將自己的參數類型傳遞給DropCommand。所以基本上我在View的代碼中的代碼看起來像這樣:調用在xaml中分配的ICommand

// get data required for ordering operation 
var args = MyHelperClass.OnDropCompleted(a); // where a is an argument from UI drop event 

// execute command 
if (args != null) ViewModel.DropCommand.Execute(args); 

這很好,但是,這個代碼在每個視圖上重複。我的想法是一個DropCommand添加到我的自定義UI控件,這樣我就可以分配的ICommand在XAML綁定現在

DropCommand={Binding DropSommand} <-- binds to ViewModel's DropCommand 

,我能勝任我的定製UI控件拖放事件,並在視圖模型調用命令,並通過它計算出了論點。

問題:

1)我想訂閱Drop操作只有DropCommand的結合在XAML中設置。我如何檢查這個綁定是否設置?

2)創建要傳遞給ViewModel的ICommand的參數後,我想從代碼中調用此命令。我怎樣才能做到這一點?

編輯:我也有以下的綁定方案:

DropCommand={Binding DataContext.DropCommand, elementName=window} 

回答

0

在您的drop事件處理程序在你的自定義控件的代碼隱藏:

var bindingExpression = GetBindingExpression(DropCommandProperty); 
if (bindingExpression != null) 
{ 
    var command = (ICommand)bindingExpression.ParentBinding.Source; 
    command.Execute(/* your special argument here */); 
} 

一個BindingExpression的存在告訴你,什麼是綁定,並且您可以通過BindingExpressionParentBinding屬性獲取該綁定的Source

+0

嗨Jay,似乎我有一個問題得到命令參考。在這種情況下,我的綁定與上面提供的略有不同。我正在設置Path和ElementName。 ParentBinding爲Source返回null,併爲ElementName(其DataContext設置爲ViewModel的控件的名稱)和Path返回正確的值。我該如何處理這種情況? – Goran 2012-04-29 03:33:24

+0

我能夠通過反射從BindingExpression獲取ICommand。 – Goran 2012-04-29 15:44:53