我有以下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:这是刚刚加载硬编码属性值的窗口的屏幕截图。现在我看到空的新行。
屏幕2:我在这里将数据添加到值为Rambo和Russia的新行中。现在,无论我做什么(制表符,单击另一个单元格),都不会添加下一个新行。我相信应该添加一个新行。
屏幕3:此处新添加的行值已消失。那是因为我双击了两个空单元格之间的细边框。现在这很奇怪。
屏幕4:现在当我点击Peter单元格时,之前输入的行数据又回来了,但现在它被按下并在它之前插入一个新的空行。这很奇怪。
任何人都可以帮助我理解DataGrid的这种行为。
答案 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(){}
}
然后新的空行出现在数据网格的底部。