2011-10-24 22 views
15

ビュー内のWPFイベントをViewModelにバインドするにはどうすればよいですか?ViewからViewModelへのWPFイベントバインディング?

私のビューでドロップイベントが発生しましたが、私はそれをViewModelのバインディングに置き換えたいと思います。 いくつかの解決策を見つけましたが、私の考えたことはありませんでした。

ビューコード:行うには

<TextBox 
    AllowDrop="True" 
    PreviewDrop="email_Drop" /> 
+4

は良いアイデアになることはありません。もちろん、MVVMをどのように動作させたいかによって異なりますが、私たちは論理的なイベントであるイベントとビジネスロジックであるコマンドを厳密に分離しています。ちょうどこれを追加したかったのです:最終的には、どのようにして達成したいのかによって大きく異なります。 – dowhilefor

+0

ありがとう、素晴らしいコメント私はこれを念頭に置いておきます。今のところ、ファイルの背後にあるコードを空にしたいだけです。しかし、私があなたが読んだすべてのものから正しいです;) – jefsmi

+0

@dowhileforそれは答えです - それは良いものです。私は何かを書くことをお勧めします。 :) – ANeves

答えて

37

一つの方法は、ブレンドの対話機能を使用することです。この名前空間には、InvokeCommandActionクラスとCallMethodActionクラスが含まれています。

InvokeCommandActionを使用すると、任意のイベントをview-modelコマンドにバインドできますが、CallMethodActionでは任意のイベントをビューモデルメソッドにバインドできます。

例えば

あなたはこのように行うだろうビュー-modelコマンドをボタンのDoubleClickイベントをバインドしたい場合:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

すべてのあなたは:

<Button> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

そして、この名前空間を宣言Expression BlendまたはExpression Blend SDKをインストールするのがプロジェクトで参照する必要があります。

3

まあ一つの方法は、イベントの振る舞いを定義することによって、すなわち、コマンドにそのイベントを変換し、発表者のコマンドにバインドすることです。

これを参照してください、MVVMとXAMLでイベントを処理するWPF Event Binding to ViewModel (for non-Command classes)

+0

私はEventToCommandソリューションを見つけましたが、私はそれの巨大なファンではありませんでしたので、これを解決するより良い方法があったかどうかを知りたいです;) – jefsmi

+1

:)それはあなたに合っている場合は、 – whoisthis

1
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}"> 

</Button> 

コマンド

{EB:EventBinding}(コマンドを見つけるための簡単な命名パターン)

{EB:EventBindingコマンド=のCommandName}

CommandParameter

$ e(EventAgrs)

$このまたは芋のviewmodelにイベントを結合$ this.Property

文字列

https://github.com/JonghoL/EventBindingMarkup

関連する問題