Как изменить свойства элемента DataGridTemplateColumn DataTemplate для конкретной ячейки - PullRequest
1 голос
/ 02 июля 2019

У меня проблема с моей DataGrid, которую я создал некоторое время назад.DataGrid показывает информацию о задачах проекта.Теперь я должен сделать столбцы начальной и конечной даты редактируемыми.Для этого я изменил DataGridTextColumn со следующим кодом:

<DataGridTemplateColumn Header="Start"  Width="100" CanUserReorder="True">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <DatePicker 
        x:Name="DpStartDate" 
        SelectedDate="{Binding PlannedStart, StringFormat=\{0:dd.MM.yyyy\}}" 
        IsEnabled="False"/>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Пока все хорошо.Теперь проблема в том, что мне нужно проверять каждую строку, находится ли Задача в правильном состоянии, чтобы изменить дату.Если это так, я должен включить DatePicker.В коде позади я попробовал это так:

for(int _i = 0; _i < DgvProjectTaskList.Items.Count; _i++)
{
      switch (((TaskListViewModel) DgvProjectTaskList.Items[_i]).Task.State)
      {
         case TaskStates.InWork:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = false;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = true;
            break;
         }
         case TaskStates.Done:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = false;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = false;
            break;
         }
         default:
         {
            DatePicker _dpStart = DgvProjectTaskList.Columns[4].GetCellContent(_i) as DatePicker;
            _dpStart.IsEnabled = true;
            DatePicker _dpEnd = DgvProjectTaskList.Columns[5].GetCellContent(_i) as DatePicker;
            _dpEnd.IsEnabled = true;
            break;
         }
      }
}

Проблема в том, что "GetCellContent" возвращает null каждый раз.Итак, мой вопрос, как я могу изменить DatePicker в каждой строке отдельно?Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Я наконец решил проблему, создав bool в ViewModel и связав его со свойством isEnabled DatePicker.

2 голосов
/ 02 июля 2019

Я думаю, вы должны сделать это следующим образом:

var contentPresenter = DgvProjectTaskList.Columns[4].GetCellContent(item);
var datePicker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
datePicker.IsEnabled = true;

GetCellContent() возвращает ContentPresenter, первым дочерним элементом которого является DatePicker


Если вы попробуете это, оно будет работать:

  foreach (var item in DgvProjectTaskList.Items)
  {
    bool enable = item.Task.State != TaskStates.Done;

    var contentPresenter = Data.Columns[4].GetCellContent(item );
    var picker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
    picker.IsEnabled = enable;
    contentPresenter = Data.Columns[5].GetCellContent(item );
    picker = VisualTreeHelper.GetChild(contentPresenter, 0) as DatePicker;
    picker.IsEnabled = enable;
  }
...