Привязка комбокса в wpf datagrid

У меня есть список, который я заполняю в начале моей модели представления:

ListOfEmployees = new List<EmployeeBO>(employeeRepository.GetEmployees(true, true));

Я пытаюсь получить комбинированный список в сетке данных для заполнения из этого списка.

<DataGridTemplateColumn Header="U/M" MinWidth="145">
 <DataGridTemplateColumn.CellEditingTemplate>
  <DataTemplate>
   <ComboBox Name="cboUnitMeasure" 
     ItemsSource="{Binding Path=ListOfUnitMeasures}"
     DisplayMemberPath="UnitMeasureDescription" SelectedValuePath="UnitMeasureValue" 
     SelectedValue="{Binding UnitMeasureValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     HorizontalAlignment="Left" Width="140" />
  </DataTemplate>
 </DataGridTemplateColumn.CellEditingTemplate>
 <DataGridTemplateColumn.CellTemplate>
  <DataTemplate>
   <TextBlock Text="{Binding UnitMeasureDescription}" />
  </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Когда dg загружается, шаблон ячейки отображает значение UnitMeasureDescription, но когда я щелкаю ячейку для редактирования, в выпадающем списке нет элементов. С другой стороны, когда я использую статический ресурс из XML-файла в качестве источника элементов (используя те же имена свойств), комбинированный список содержит элементы:

<DataGridTemplateColumn Header="U/M" MinWidth="145">
 <DataGridTemplateColumn.CellEditingTemplate>
  <DataTemplate>
   <ComboBox Name="cboUnitMeasure" 
     ItemsSource="{Binding Source={StaticResource UnitMeasureData}}"
     DisplayMemberPath="UnitMeasureDescription" SelectedValuePath="UnitMeasureValue" 
     SelectedValue="{Binding UnitMeasureValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
     HorizontalAlignment="Left" Width="140" />
  </DataTemplate>
 </DataGridTemplateColumn.CellEditingTemplate>
 <DataGridTemplateColumn.CellTemplate>
  <DataTemplate>
   <TextBlock Text="{Binding UnitMeasureDescription}" />
  </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Я установил точку останова сразу после заполнения ListOfEmployees в моем виртуальном компьютере, и он содержит элементы. Я также проверил правильность имен свойств в DisplayMemberPath и SelectedValuePath. Не уверен, что я здесь делаю не так.

1 ответ

Решение

Является ли "ListOfUnitMeasures" свойством виртуальной машины или свойством EmployeeBO? Хорошо, если предположить, что для DataSrid ItemsSource установлено значение List<EmployeeBO> и что есть еще один список на виртуальной машине под названием "ListUnitOfMeasures", вот мое объяснение:

DataContext каждой строки в DataGrid будет равен элементам в ItemsSource DataGrid. В вашем случае каждая строка будет использовать EmployeeBO в качестве своего DataContext. А поскольку ListOfUnitMeasures не является свойством Employee BO, привязка к ComboBox не будет работать и, следовательно, ничего не будет отображаться.

Одним из возможных решений является изменение привязки на ComboBox для использования RelativeSource, указывающего на родительский DataGrid, следующим образом:

<ComboBox Name="cboUnitMeasure" 
     ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.ListOfUnitMeasures}"/>
Другие вопросы по тегам