8

MVVM パターン、RelayCommand などを使用して WPF アプリケーションを開発しています。

私がやりたいことは、たとえば楕円などの形状を移動し、その最終的な位置を取得してデータベースに入れることだけです。

しかし、イベント (MouseLetButtonDown、MouseLeftButtonUp、および MouseMove) をコマンドにバインドできません。アタッチされたビヘイビアについて読みましたが、位置を取得するにはイベントの引数 (MouseButtonEventArgs と MouseEventArgs) が必要です。

解決?

4

3 に答える 3

8

MVVM グラフィカル アプリケーションを作成する場合、必要なすべてのイベントをビュー モデルに送信しようとする誘惑にかられます。ただし、コマンドでビュー固有のマウス イベント引数を処理することは、MVVM の原則と疎結合の目標に反します。

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

グラフィックオブジェクトをドラッグするためにマウスイベントを使用する動作の完全な例については、こちらの回答を参照してください。

ビューによって実行されるインタラクティブ性により、ビューモデルはデータとコマンドに固執できます。

于 2011-01-24T22:12:28.550 に答える
2

これはSilverlightで機能するため、WPFで機能するはずです(または少なくともマイナーな変更を加える必要があります)

<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
于 2011-01-24T18:46:37.607 に答える
0

XCommandオープン ソース コードプレックス wpf 拡張プロジェクト xcommand.codeplex.com見つけることができます。これにより、MouseMove、MouseLeftButtonDown などの任意のイベントの Command および CommandParameter を、WPF UIElement から継承する任意の UI 要素にバインドできます。

クラス ライブラリの Windows ストア 8 アプリケーションおよび Windows デスクトップ アプリケーション バージョンは、こちらにあります。WPF デスクトップ アプリケーションを扱う WPFXCommand が必要です。ここで、それがどのように機能するか。希望するプロジェクトへの参照としてWPFXCommand.dllを追加します。

以下のように、xaml ファイルに名前空間を追加します。

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

これで、 CommandCommandParameterを、以下のように WPF UIElement から継承する任意の UI 要素で使用可能なイベントにバインドできます。

    <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>

これが、イベント ベースのコード ビハインドを取り除くのに役立つことを願っています。

于 2014-04-27T21:05:53.123 に答える