ICollectionView中sortdescription的自定义比较器



我有下一个问题。有一些与DataGrid的WPF对话框。这个DataGrid显示一些表。表包含1列和一个Date。此Date属性表示为字符串。在大多数情况下,Date具有我们从数据库中读取的一些值。但在某些情况下,用户可以在该表中创建一条新记录。在这种情况下,Date应该为null(带有"null")value,而不是String.Empty)。它应该作为空值写入数据库。还有表格中的单元格"null"Date应为空。这就是为什么我们使用字符串类型

DataGrid ItemSource属性已经绑定到视图模型中的ICollectionView MyView属性。此外,视图模型包含与我的数据集合相关的其他属性,并用于MyView:

public class MyCustomObject
{
public string Date { get; set; }

// some other properties.
}
public class MyViewModel
{
public ObservableCollection<MyCustomObject> TableItems
{
get { return tableItems; }
set
{
Set(ref tableItems, value, true);
TableView = CollectionViewSource.GetDefaultView(tableItems);
}
}
public virtual ICollectionView TableView
{
get { return tableView; }
set
{
Set(ref tableView, value);
}
}
public MyViewModel()
{
var someCollection = new List<MyCustomObject>();
TableItems = new ObservableCollection<MyCustomObject>(someCollection);
}
}

在MyViewModel的一些方法中,我通过ICollectionView.SortDescriptions为我的集合添加了排序。如:

TableView.SortDescriptions.Add(new SortDescription(nameof(MyCustomObject.Date), ListSortDirection.Ascending));

所有作品。但由于我的Date是字符串,它作为字符串进行比较。所以我可以得到这样的东西:

02/10/19
03/09/19
03/10/20
04/08/17

我如何添加一些自定义比较到我的TableView和改变一些属性的排序逻辑?在将其添加到TableItems之前,我应该在构造函数中添加自定义比较器到我的someecollection吗?

必须将ICollectionView转换为ListCollectionView

根据实际的集合,CollectionViewSource.GetDefaultView返回的视图是ICollectionView的实现。
对于IList类型的集合,这是ListCollectionView

还可以考虑使用DateTime而不是string来存储日期。

下面的例子创建了一个日期字符串IComparer或另一个DateTimeIComparer,并将其分配给集合的视图:

var listCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(this.TableItems);
// To compare DateTime 
Comparer<DateTime> dateTimeComparer = Comparer<DateTime>.Create(DateTime.Compare);
// To compare date strings.
// Optionally define the date culture for DateTime.Parse
CultureInfo dateCulture = CultureInfo.CurrentCulture;
Comparison<string> dateTimeStringComparison = (stringX, stringY) 
=> DateTime.Compare(DateTime.Parse(stringX, dateCulture), DateTime.Parse(stringY, dateCulture));
Comparer<string> dateTimeStringComparer = Comparer<string>.Create(dateTimeStringComparison);
listCollectionView.CustomSort = dateTimeStringComparer;

最新更新