2011-01-24 10 views
8

私は など、MVVMパターンでRelayCommandをWPFアプリケーションを開発しています、私はこの質問にたくさん読んで私はように明確ではない午前:WPFおよびMVVM。結合事象

私がやりたいすべては、図形を移動であります例えば、楕円のように、最終的な位置を取得してデータベースに格納します。

しかし、イベント(MouseLetButtonDown、MouseLeftButtonUp、MouseMove)をコマンドにバインドすることはできません。私は添付された動作について読んだことがありますが、私はイベントの引数(MouseButtonEventArgsとMouseEventArgs)を取得して位置を取得する必要があります。

解決策?

これは、それがWPFに取り組む必要がありますので、Silverlightのために働く

答えて

2

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

ブレンドを使用していることを忘れました – TigOldBitties

8

MVVMグラフィカルアプリケーションを書いて、あなたが必要とするすべてのイベントを送信しようとしたくなる(または、それはわずかな変更ですべき少なくとも)ビューモデルに渡します。しかし、コマンド内でビュー固有のマウスイベント引数を処理することは、MVVMの原則およびルーズカップリングの目標に反します。

この問題を解決する方法は、ビューを実行できるタスクに操作を抽象化し、その結果を操作およびデータを介してビュー・モデルに戻すことです。これをサポートするコードビハインドで少量のコードを実行したい場合、MVVM警察はあなたの子供を連れて行くことはありません。しかし、さらに良い方法は、行動に対話性を追加することです。ビヘイビアは、MVAMパターンや、対話性を必要とするアプリケーションの場合、XAMLにイベントハンドラを追加する必要のあるコードビハインドのない、再利用可能な機能です。 、ビューモデルはできるビューによって行わあなたの対話で

グラフィカルオブジェクトをドラッグするためマウスイベントを使用しての行動の完全な例のためにここに私の答えを参照してください。データとコマンドに固執する。

+0

ありがとう、私が必要としていたものでした。今私はパターンMVVMをよりよく理解しています。 –

0

あなたがここXCommandオープンソースのCodePlexのWPF拡張子プロジェクト、xcommand.codeplex.comを見つけることができ、これはあなたがWPF UIElementから継承する任意のUI要素へのMouseMove、のMouseLeftButtonDownなどの任意のイベントのコマンドとCommandParameterをバインドすることができます。

ここでは、8つのアプリケーションとWindowsデスクトップアプリケーションのクラスライブラリが保存されています。あなたは、WPFデスクトップアプリケーションを扱うWPFXCommandが必要です。 ここでは、どのように動作します。 WPFXCommand.dllをご希望のプロジェクトへの参照として追加してください。

以下のようにあなたのXAMLファイルの名前空間を追加します。任意のUI要素で使用可能な任意のイベントに CommandParameter今

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

、あなたがコマンドをバインドすることができはと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を取り除くのに役立ちますベントベースのコードの背後にある。

関連する問題