0

我有一个列表,我在我的视图模型的初始化中填充:

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 中的属性名称是否正确。不知道我在这里做错了什么。

4

1 回答 1

3

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

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

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

<ComboBox Name="cboUnitMeasure" 
     ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.ListOfUnitMeasures}"/>
于 2010-08-05T15:42:12.800 回答