你想要的是在基於FrameworkElement的RoutedEvent的ViewModel中觸發一個ICommand。不幸的是,WPF不支持這種「開箱即用」。一些可能性:
1)與Expression Blend 3有Microsoft.Expression.Interactivity.dll,它允許這。有關如何執行此操作的示例,請參閱WPF : Blend 3 Interactions/Behaviours。
2)您可以在代碼隱藏中使用一個事件處理程序,它直接調用相應的ViewModel命令。例如:
private void FrameworkElement_DragDelta(object sender, EventArgs e)
{
this.MyViewModel.OnDragDelta(sender, e);
}
3)由於Cinch框架的一部分,有一個attached command behaviour。這樣,你不必改變你的代碼隱藏。例如:
Cinch:SingleEventCommand.RoutedEventName="DragDelta"
Cinch:SingleEventCommand.TheCommandToRun="{Binding Path=DragDeltaCommand}"
請注意,這將調用ICommand並傳遞一個對象(實際上是一個SCommandArgs)作爲命令參數。要獲得實際的路由事件的參數在你的命令處理程序,請執行下列操作:
var sargs = args as SCommandArgs;
if (sargs == null)
{
return;
}
var routedEventArgs = sargs.EventArgs as RoutedEventArgs; // Or whatever arguments you actually expect
if (routedEventArgs == null)
{
return;
}
// Do something here with the event arguments
編輯:在Binding Commands to Events?
謝謝丹尼爾的忠告也看一看。 我通過在後面的代碼中處理Thumb的'DragDelta'事件開始,並將事件的HorizontalChanged和VerticalChanged值綁定到ViewModel中的屬性。然後我將我的Thumb的Canvas.Left和Canvas.Top屬性綁定到我的ViewModel。簡單而整潔,但我覺得需要刪除背後的代碼。 我認爲HorizontalChanged和VerticalChanged只能用作Thumb的DragDelta事件的參數。考慮到這一點,我不知道如何將這些直接綁定到ViewModel。 – Chris 2010-04-29 10:18:46
如果您只將數據作爲事件參數的一部分,那麼您將不得不使用方法(1)或(3),或者使用小的代碼隱藏。順便說一句,只要沒有涉及大的(難以測試的)邏輯,我不認爲有一些代碼隱藏有什麼問題。 – 2010-04-29 12:12:51