假设我们有一个 DataGrid,其中填充了 2 列:“First Name”和“Last Name”。
我的目标是按 LastName 对 DataGrid 进行排序。当 ObservableCollection(在 DataGrid 后面)追加或从中删除项目时,它应该可以工作。
是否有一些简单的 XAML 解决方案,或者我必须通过代码来完成?
PS 我知道 ICollectionView 解决方案,但我正在寻找小而自然的解决方案。
假设我们有一个 DataGrid,其中填充了 2 列:“First Name”和“Last Name”。
我的目标是按 LastName 对 DataGrid 进行排序。当 ObservableCollection(在 DataGrid 后面)追加或从中删除项目时,它应该可以工作。
是否有一些简单的 XAML 解决方案,或者我必须通过代码来完成?
PS 我知道 ICollectionView 解决方案,但我正在寻找小而自然的解决方案。
使用 SortedList 作为您的数据上下文,并在您的 ViewModel 中实现 INotifyPropertyChanged,这将替换 ObservableCollection。
并使用 SortedList 您可以根据需要对集合进行排序...
按照 user1763180 的建议实施INotifyPropertyChanged,只有在OnPropertyChanged每次调用Add集合时都有效。ObservableCollection很方便,因为您不需要处理INotifyPropertyChanged接口。
最简单的方法是打电话
dataGridView.Sort(dataGridView.Columns[1], ListSortDirection.Ascending);
在你的DataGridView.
另一种选择:调用Insert或覆盖用于自动保持集合排序的Add方法Insert。
public void Add(string firstName, string lastName)
{
for (int i = 0; i < _lastNames.Count; i++)
{
if (lastName.CompareTo(_lastNames.Items[i]) >= 0)
{
_lastNames.Insert(i, lastName);
_firstNames.Insert(i, firstName);
break;
}
}
}
我会跳过 DataGrid 并使用只读的 GridView ListView
这段代码只是手动输入的,没有经过测试,但我做了一些接近的事情
private ObservableCollection<person> persons;
public ObservableCollection<person> PersonsSorted { get { return persons.orderby(x => x.LastName; } }
将 ListView 绑定到 PersonsSorted
它将被添加和删除
使用其他控件添加和删除人员。
如果你编辑将需要实现 iNotifyPropertyChanged