2010-04-21 92 views
2

感謝您看一下這個問題。如何在控件事件中添加新命令

我一直在建設以下的MVVM模式的約什 - 史密斯的例子應用程序(VB/WPF):Click here to view

我的觀點都有其在事件觸發命令控制,如按鈕點擊這些都是綁定到ViewModel中的屬性。

我的ViewModel公開了調用適當方法的ICommand類型的屬性。

這一直很好,直到現在!我現在想要使用Thumb控件來允許用戶在Canvas中移動對象。我不相信Thumb具有「開箱即用」的命令功能。移動時,Thumb引發'DragDelta'事件。所以我的問題如下:

如何擴展一個控件的能力來發出一個命令,請事件?

我想發出一個新的命令,讓我們說'onDragDelta',以便我可以將它綁定到我的ViewModel中的屬性,就像我的按鈕。

非常感謝您

回答

0

而不是使用ICommand的,我寧願數據綁定拇指的當前位置到您的視圖模型的屬性。現在,如果位置發生了變化,您可以在ViewModel中執行一些方法,並將差值作爲參數。

我不知道這是否符合您的需求,但這是我的第一個想法。

3

你想要的是在基於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?

+0

謝謝丹尼爾的忠告也看一看。 我通過在後面的代碼中處理Thumb的'DragDelta'事件開始,並將事件的Horizo​​ntalChanged和VerticalChanged值綁定到ViewModel中的屬性。然後我將我的Thumb的Canvas.Left和Canvas.Top屬性綁定到我的ViewModel。簡單而整潔,但我覺得需要刪除背後的代碼。 我認爲Horizo​​ntalChanged和VerticalChanged只能用作Thumb的DragDelta事件的參數。考慮到這一點,我不知道如何將這些直接綁定到ViewModel。 – Chris 2010-04-29 10:18:46

+0

如果您只將數據作爲事件參數的一部分,那麼您將不得不使用方法(1)或(3),或者使用小的代碼隱藏。順便說一句,只要沒有涉及大的(難以測試的)邏輯,我不認爲有一些代碼隱藏有什麼問題。 – 2010-04-29 12:12:51

相關問題