2017-10-12 154 views
1

WPFプロジェクト(C#、MVVM Light、Visual Studio 2010)があります。WPFビューモデル内のマウス座標の取得

私は基本的にこれが問題の分離に関する少しの問題を抱えています。私はビューモデルでコマンドを持っています。私は、そのコマンドを呼び出すコンテキストメニューを持っています。ここまでは順調ですね。問題は、マウスがクリックされたことをコマンドが調整する必要があることです。

もう少し具体的には、ContextMenuは、特定のCanvasコントロールをクリックすると表示され、そのキャンバスコントロール内の必要な座標内にあります。

これを行う簡単な方法は、XAMLドキュメントのコードの後ろにあるすべてのコードを管理することです(私はそうすることができました)が、できればViewModelに入れたいそう。その理由は、このコマンド内で自分のデータモデルを呼び出すため、分離の問題に終わるからです。

私はPassEventArgsToCommandを認識していますが、これは悪い習慣であることを認識していますが、この場合は回避方法がわかりません。だから、一瞬のために、私はそれを試してみました、そして、それは次のようになります。

<ContextMenu x:Key="BackgroundMenu"> 
      <MenuItem Header="Add new node here"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="Click"> 
         <cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext.AddNewNodeAtLocationCommand}" PassEventArgsToCommand="True"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </MenuItem> 
     </ContextMenu> 

は、だから今、私のコマンドは、ビューモデルの中に、以下のようになります。私が好きな、そのメソッド内

void AddNewNodeAtLocationExecute(RoutedEventArgs e) 
    { 

     return; 
    } 

をマウスの座標を取得することができますが、可能かどうかはわかりません。 e.OriginalSourceは 'MenuItem'ですが、あまり役に立ちません。

どうすればいいですか?これはできますか?あるいは、私はちょうどこのコマンドをコードの背後で処理する必要がありますか?このコードにはデータベースへの呼び出しが含まれます。そのため、私はその分離に関して非常に特化しています。

ありがとうございます。

+0

実際のマウス座標、またはキャンバス内の要素のx座標とy座標が必要ですか? – mm8

答えて

0

私はthis questionを見つけましたが、それは懸念の分離とは何かを話しています。

最後に、私が持っていた2つのアイデアの融合を行いました。まず、ContextMenuは単純に後ろのコードにリンクします。その時点で、私は自分が望む座標を取得します。そのコードビハインドは、ビューのDataContext(私が望むコマンドがある)を取得し、Executeメソッドを呼び出します(最初に 'can'メソッドをチェックしています)。

私はそれがあなたが得ようとしているのと同じくらい理想的だと思います。

関連する問題