Привязка комбокса в 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}"/>