我有一个列表,我在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中的属性名称是否正确。不知道我在这里做错了什么。
答案 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}"/>