datagrid显示一个新行,但不显示任何后续行

时间:2013-07-18 07:31:32

标签: c# wpf datagrid combobox

我有一个数据网格,其中一列显示组合框。目前,新行显示在现有行的下方 - 正如预期的那样。

<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;

下面的图片显示第一行的绑定正在运行;我有一个新行,可以选择一个值。

enter image description here

然而,我无法获得另一个新行。这是我试图解决的问题。

从阅读其他帖子,我怀疑我在IEditableObject,INotifiyProperyChanged领域缺少一些东西,或者因为这个数据网格中只有一列,可能需要从组合框中触发一些SelectedChanged - 比如查看是否有空白行是可见的,如果没有,创建一个?

我找不到与我的问题匹配的帖子,但我确定它在那里......

可能还有其他解决方案不涉及数据网格,但是一旦我开始工作,我的下一个任务就是一个包含2列组合框的数据网格,需要在那里工作。

1 个答案:

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