在wpf datagrid中绑定组合框

时间:2010-08-05 15:08:06

标签: wpf mvvm datagrid itemsource celleditingtemplate

我有一个列表,我在viewmodel的init中填充:

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文件中的静态资源作为itemsource时 - 使用相同的属性名称 - 组合框包含项目:

<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 个答案:

答案 0 :(得分:3)

“ListOfUnitMeasures”是VM上的属性还是EmployeeBO的属性?好吧,假设DataGrid的ItemsSource设置为List<EmployeeBO>并且VM上有另一个名为“ListUnitOfMeasures”的列表,这是我的解释:

DataGrid中每行的DataContext将等于DataGrid的ItemsSource中的元素。在您的情况下,每行将使用EmployeeBO作为其DataContext。由于“ListOfUnitMeasures”不是Employee BO的属性,因此ComboBox上的Binding将不起作用,因此不会显示任何内容。

一种可能的解决方案是更改ComboBox上的Binding以使用指向父DataGrid的RelativeSource,如下所示:

<ComboBox Name="cboUnitMeasure" 
     ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.ListOfUnitMeasures}"/>