我有一个数据网格,其中一列显示组合框。目前,新行显示在现有行的下方 - 正如预期的那样。
<grid>
<DockPanel Grid.Column="0" Grid.Row="0">
<TextBlock DockPanel.Dock="Top" Text="Role Groups"/>
<DataGrid DockPanel.Dock="Bottom" Name="dgRoleGroups" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" HorizontalAlignment="Left" ItemsSource="{Binding ListSecurityUserRoleGroup}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Role Group" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ListSecurityRoleGroup,
RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Description" SelectedValuePath="ID"
SelectedValue="{Binding RoleGroupID}”/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
ListSecurityUserRoleGroup是ObservableCollection:
public class tbl_SecurityUserRoleGroup_Row
{
public int UserID { get; set; }
public int RoleGroupID { get; set; }
}
ListSecurityRoleGroup是一个列表:
public class tbl_Security_RoleGroup_Row
{
public int ID { get; set; }
public string PublicID { get; set; }
public string Description { get; set; }
}
在我背后的代码中:
dgRoleGroups.DataContext = ListSecurityUserRoleGroup;
dgRoleGroups.ItemsSource = ListSecurityUserRoleGroup;
下面的图片显示第一行的绑定正在运行;我有一个新行,可以选择一个值。
然而,我无法获得另一个新行。这是我试图解决的问题。
从阅读其他帖子,我怀疑我在IEditableObject,INotifiyProperyChanged领域缺少一些东西,或者因为这个数据网格中只有一列,可能需要从组合框中触发一些SelectedChanged - 比如查看是否有空白行是可见的,如果没有,创建一个?
我找不到与我的问题匹配的帖子,但我确定它在那里......
可能还有其他解决方案不涉及数据网格,但是一旦我开始工作,我的下一个任务就是一个包含2列组合框的数据网格,需要在那里工作。
答案 0 :(得分:2)
您只需添加一个编辑模板:
<Grid>
<DockPanel Grid.Column="0" Grid.Row="0">
<TextBlock DockPanel.Dock="Top" Text="Role Groups"/>
<DataGrid DockPanel.Dock="Bottom" Name="dgRoleGroups" AutoGenerateColumns="False"
CanUserAddRows="True" CanUserDeleteRows="True"
HorizontalAlignment="Left" ItemsSource="{Binding ListSecurityUserRoleGroup}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Role Group" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ListSecurityRoleGroup,
RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValue="{Binding RoleGroupID,UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Description" SelectedValuePath="ID" IsHitTestVisible="False">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding ListSecurityRoleGroup,
RelativeSource={RelativeSource AncestorType=UserControl}}"
DisplayMemberPath="Description" SelectedValuePath="ID"
SelectedValue="{Binding RoleGroupID,UpdateSourceTrigger=PropertyChanged}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
</Grid>
您还可以将组合框模板修改为文本块:
<ComboBox.Template>
<ControlTemplate>
<TextBlock Text="{Binding SelectedItem.Description,RelativeSource={RelativeSource Mode=TemplatedParent}}"></TextBlock>
</ControlTemplate>
</ComboBox.Template>