可编辑的DataGrid - CanUserAddRows =" True"不工作

时间:2014-03-11 15:34:41

标签: wpf datagrid datagridtemplatecolumn

我有以下DataGrid:

 <DataGrid ItemsSource="{Binding EmployeeList}" CanUserAddRows="True" AutoGenerateColumns="False" Margin="0,0,0,90">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="CountryCombo2">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=DataContext.CountryList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
                                      DisplayMemberPath="CountryName" 
                                      SelectedItem="{Binding EmployeeCountry, Mode=TwoWay}"
                                      SelectedValue="{Binding EmployeeCountry.CountryId}"
                                      SelectedValuePath="CountryId" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

但是,我无法向DataGrid添加新行。如果我需要提供任何其他代码,请告诉我。

更新:

屏幕1:这是刚刚加载硬编码属性值的窗口的屏幕截图。现在我看到空的新行。

Screen 1

屏幕2:我在这里将数据添加到值为Rambo和Russia的新行中。现在,无论我做什么(制表符,单击另一个单元格),都不会添加下一个新行。我相信应该添加一个新行。

Screen 2

屏幕3:此处新添加的行值已消失。那是因为我双击了两个空单元格之间的细边框。现在这很奇怪。

Screen 3

屏幕4:现在当我点击Peter单元格时,之前输入的行数据又回来了,但现在它被按下并在它之前插入一个新的空行。这很奇怪。

Screen 3

任何人都可以帮助我理解DataGrid的这种行为。

3 个答案:

答案 0 :(得分:4)

我要继续发布这个作为答案,因为我需要发布一个代码示例,评论开始扩展(获得邀请聊天消息)。

原始问题的答案是确保ItemsSource的Type T具有无参数构造函数。

尝试附加到DataGrid的BeginningEdit事件的此代码以吞噬单元格边框点击:

private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    //// Have to do this in the unusual case where the border of the cell gets selected
    e.Cancel = true;
}

如果您实际上正在将此处理程序用于其他内容或打算使用,则可以检查OriginalSource以查看它是否为Border并在该条件下取消该事件。

答案 1 :(得分:3)

使用DataGridTextColumn和DataGridComboBoxColumn而不是DataGridTemplateColumn,然后将充分添加行。

如果要使用DataGridTemplateColumn,则不仅要设置CellTemplate,还要设置CellEditingTemplate。例如:

<DataGridTemplateColumn Header="Pick a Date">
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding myDate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <DatePicker SelectedDate="{Binding myDate}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

答案 2 :(得分:3)

就我而言,

首先确保您的ItemSource未使用无法向其添加新项目的array

使用List之类的东西可以添加newItem,

此外,List Class应该有default constructor不带

之类的参数
List<SomeClass>();

public Class SomeClass{

  public SomeClass(){}

}

然后新的空行出现在数据网格的底部。

参考这个答案https://stackoverflow.com/a/21089367/4573839