2016-12-08 9 views
-1

У меня есть DataGrid, связанный с коллекцией Appointment объектов. В сетке показаны встречи на определенную неделю, с столбцами в виде дней и строк как раз, ergo каждая ячейка привязана к назначению.Как получить местоположение ячейки WPF DataGrid?

Когда пользователь нажимает на ячейку, я хочу показать небольшое окно с кратким описанием назначения этой ячейки. По сложным причинам я не могу настроить ячейку для отображения сводки, и, что более важно, я хочу, чтобы сводка выпадала и перекрывала ячейки ниже выбранной.

В моей команде, связанной с одним щелчком мыши, через какую-то магию я получаю 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> 

и код команды принимает параметр типа SelectedCellsCollection, который содержит только один DataGridCellInfo. У меня нет другой информации для работы в команде. Как бы то ни было, я обманываю себя настолько, чтобы быть настолько интимным с представлением внутри viewmodel, поэтому я хотел бы избегать выхода за борт и напрямую использовать события с кодом.

+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

Всплывающее окно - это что-то специфическое для пользовательского интерфейса, и, на мой взгляд, нужно как-то позиционировать его.

В прошлом, когда я сделал something similar, мой ViewModel отслеживал фактические данные, SelectedItem и флаг для IsDetailsVisible.

Из представления у меня будет «всплывающее» UserControl, которое сидит поверх моей сетки. Видимость была привязана к свойству IsDetailsVisible, и данные были привязаны к SelectedItem. Для моего проекта всплывающее окно было сосредоточено, однако должно быть простым примером, чтобы представление отображало свойства Top/Left PopupUserControl, чтобы он соответствовал ячейке, на которую пользователь нажал.

Для поиска фактической ячейки сетки в пользовательском интерфейсе есть несколько способов обойти это. Проще всего было бы, вероятно, использовать событие Click или MouseDown, а оттуда поместить PopupUserControl в соответствии с Clicked DataGridCell. Как я уже сказал, такая вещь для меня специфична для просмотра, поэтому должна идти в коде за View.

Кроме того, я никогда не любил всплывающее окно WPF, поэтому сделал свой собственный пользовательский UserControl, который я всегда использовал бы вместо этого. Код можно найти в моем блоге here, если вы заинтересованы в его использовании или выполнении чего-то подобного.