2016-12-08 154 views
-1

AppointmentのコレクションにバインドされたDataGridがあります。グリッドは、各セルが予定にバインドされている間、列を日として、行を時間として、与えられた週の予定を表示します。WPF DataGridセルの位置を取得するにはどうすればよいですか?

ユーザーがセルを1回クリックすると、そのセルの予定の概要が表示された小さなウィンドウが表示されます。理由が複雑なため、セルをテンプレートに表示して要約を表示することはできません。さらに重要なのは、要約をドロップして、選択したセルの下にセルを重ねることです。

私のコマンドでは、魔法を使ってクリックすると、選択したセル自体にDataGridCellInfoが表示されますが、そのオブジェクトには測位のヒントはなく、一部のディメンションしかありません。ダブルクリックのための結合の入力は次のようになります。

<DataGrid.InputBindings> 
    <!--TODO Remove name 'TheGrid' and find parent DataGrid--> 
    <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ApptClickCommand}" CommandParameter="{Binding ElementName=TheGrid, Path=SelectedCells}" /> 
</DataGrid.InputBindings> 

とコマンドコードが一つだけDataGridCellInfoを含む型SelectedCellsCollection、のパラメータを受け取ります。私はコマンドで作業する他の情報はありません。それは、私はビューモデル内のビューに非常に親しみを感じていますので、船外に出て、コードビハインドイベントを直接使用することは避けてください。

+0

「場所」はどのようなあなたが探していますか? – mm8

+0

@ mm8画面の座標ですので、私が言ったように、 "要約をドロップダウンして、選択したセルの下にセルを重ねる"ようにします。 – ProfK

+0

あなたは私の答えを見ましたか? – mm8

答えて

0

あなたはDataGridCell要素を取得して、その画面はVisual.PointToScreenメソッドを使用して座標見つけることができる方法の例です:

private void AppClickCommandExecuted(IList<DataGridCellInfo> cells) 
    { 
     if(cells != null && cells.Count > 0) 
     { 
      DataGridCellInfo cellInfo = cells[0]; 
      FrameworkElement cellContent = cellInfo.Column.GetCellContent(cellInfo.Item); 
      if (cellContent != null) 
      { 
       DataGridCell cell = cellContent.Parent as DataGridCell; 
       if(cell != null) 
       { 
        Point screenCoordinates = cell.PointToScreen(new Point(0, 0)); 
        //place your popup based on the screen coordinates of the cell... 
       } 
      } 
     } 
    } 
1

ポップアップはUI固有のもので、私の意見では何とかビューから配置する必要があります。

これまではsomething similarでしたが、私のViewModelは実際のデータ、SelectedItem、およびIsDetailsVisibleのフラグを追跡しました。

ビューからは、私のグリッドの上に座っている "ポップアップ" UserControlがあります。可視性はIsDetailsVisibleプロパティにバインドされており、データはSelectedItemにバインドされています。私のプロジェクトではポップアップが中心になりましたが、PopupUserControlのTop/LeftプロパティをViewがユーザがクリックしたセルと一致するように設定するのは簡単なケースです。

UIの実際のグリッドセルを見つけるには、いくつかの方法があります。最も簡単なのは、おそらくClickイベントまたはMouseDownイベントを使用することでしょう。そこから、Clicked DataGridCellに従ってPopupUserControlを配置します。私が言ったように、このようなものはビュー固有のものなので、Viewのコードビハインドに入るべきです。

また、私は決してWPFのポップアップが好きではなかったので、自分のカスタムUserControlを作って、いつも代わりに使っていました。コードは、私のブログhereで見つけられます。ここで

関連する問題