【发布时间】:2011-01-19 20:15:44
【问题描述】:
在 wpf datagrid 中如何获得顶部的空白行?即当用户想要添加新行时,它总是在底部。但我希望它处于领先地位......我可以在 XAML 中做到这一点吗?
【问题讨论】:
在 wpf datagrid 中如何获得顶部的空白行?即当用户想要添加新行时,它总是在底部。但我希望它处于领先地位......我可以在 XAML 中做到这一点吗?
【问题讨论】:
NewItemPlaceholderPosition.AtBeginning 呢?我没有代码示例,但这似乎就是您所描述的。您始终可以按照 Johan 的建议进行操作,并以编程方式移动或排序网格中的项目。
Ray Burns 添加的代码示例:
var view = CollectionView.GetDefaultCollectionView(EmployeeList)
as IEditableCollectionView;
if(view!=null)
view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
请注意,这需要 NET Framework 3.5 或更高版本。
【讨论】:
如果您使用的是 MMVM 方法,您可以像这样以编程方式添加新行:
var newEmp = new EmployeeViewModel(new EmployeeDto());
EmployeeList.Add(newEmp);
EmployeeList.Move(EmployeeList.IndexOf(newEmp), 0);
在我的示例中,我使用 EmployeeListViewModel 来显示 EmployeeViewModels 的 ObservableCollection。
然后您还可以为此行为编写测试。 比 XAML 更多的控制......
/约翰
【讨论】:
这个答案很大程度上取决于您如何绑定 DataGrid,特别是 ItemsSource 的基础类型是什么。此答案假定您使用的是ObservableCollection。由于您特别提到了 WPF,我还假设您的意思是 .NET 4.0,因为 DataGrid 仅在 Silverlight 3 和 .NET 4.0 中可用。
我假设你正在通过调用来更新一行
ItemSource.Add(new MyObject());
要获得您想要的行为,请改用以下内容:
ItemSource.Insert(0, new MyObject());
【讨论】:
您必须为 DataGrid 编写自己的模板,将 NewItemPlaceholder 部分放置在网格顶部。看看这个example 开始(虽然这个例子不是答案,它会为你指明正确的方向)。
在旁注中,我想问一下为什么需要在顶部放置 NewItemPlaceholder?它打破了我们在处理列表/网格时习惯于看到的自然自上而下的流程。
将新项目放在底部并在网格的上下文菜单中插入项目选项或类似这些线的东西可能更直观。当然,这只是我的看法。
【讨论】: