2011-01-24 67 views
8

我發展與MVVM模式,RelayCommand等 一個WPF應用程序,我在這個問題上讀了很多,但我並不清楚:WPF和MVVM。結合活動

所有我想要做的是移動形狀,例如像一個橢圓,並捕獲它的最終位置,放入數據庫。

但我無法將事件(MouseLetButtonDown,MouseLeftButtonUp和MouseMove)綁定到命令。我已閱讀關於附加行爲,但我需要事件的參數(MouseButtonEventArgs和MouseEventArgs)來檢索位置。

解決方案?

回答

2

這適用於Silverlight的,所以應該對WPF的工作(或者至少它應該稍作修改)

<i:Interaction.Triggers> 
<i:EventTrigger EventName="MouseLeftButtonDown"> 
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/> 
</i:EventTrigger> 
</i:Interaction.Triggers> 
+1

你忘了提及它使用混合 – TigOldBitties 2013-11-29 19:12:51

8

當編寫一個MVVM圖形應用程序,它是很有誘惑力的嘗試發送你需要的所有事件轉到視圖模型。但是,在命令中處理特定於視圖的鼠標事件參數與MVVM原理和鬆散耦合的目標相反。

解決此問題的方法是將操作抽象爲視圖可以執行的任務,然後通過操作和數據將其結果傳回視圖模型。如果你想在代碼隱藏中執行少量的代碼來支持這個,MVVM警察不會來帶你的孩子。但更好的方法是增加與行爲的交互性。行爲是可重用的功能塊,沒有代碼隱藏功能,可以很好地與需要交互性的MVVM模式和應用程序配合使用,否則需要向您的XAML添加事件處理程序。

見我的答案在這裏,它使用的鼠標事件拖動圖形對象行爲的一個完整的例子:

與您的互動由視圖,視圖模型可以進行堅持數據和命令。

+0

非常感謝你,正是我所需要的。現在我更好地理解模式MVVM。 – 2011-01-25 21:13:36

0

你可以找到XCommand開源CodePlex上WPF extention這裏的項目,xcommand.codeplex.com,這可以讓你綁定喜歡的MouseMove,任何的MouseLeftButtonDown事件,從WPF的UIElement繼承任何UI元素的命令和CommandParameter。

你可以在這裏找到windows store 8應用程序和windows桌面應用程序版本的類庫。你想要WPFXCommand來處理WPF桌面應用程序。 在這裏,它是如何工作的。 添加WPFXCommand.dll作爲您的願望項目的參考。

添加的命名空間,如下面的XAML文件:

xmlns:XCmd="clr-namespace:WPFXCommand;assembly=WPFXCommand" 

現在,你可以綁定命令CommandParameter在任何UI元素的任何可用事件繼承WPF的UIElement作爲如下:

<Grid> 
     <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock" 
       Foreground="{Binding FgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}" 
       XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}" 
       XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"  
       Text="{Binding Description, Mode=TwoWay}"> 
     </TextBlock> 
     <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}" 
       XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
       XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}" 
       XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}" 
       > 
     </Grid> 
    </Grid> 

希望這會幫助你擺脫e基於通風的代碼背後。