WPF数据网格中的度假区数据

本文关键字:数据 度假区 网格 数据网 WPF | 更新日期: 2023-09-27 18:00:26

我有一个实时更新的简单集合。数据显示在WPF中的DataGrid中。当用户对DataGrid进行排序并且数据发生更改时,网格将使用新数据进行更新,但不会使用数据。

当基础集合发生变化时,有人能找到一种利用数据的好方法吗?我可以很容易地确定何时发生了收集更改,但到目前为止,我在求助方面还没有取得多大成功。

发现我可以这样做:

SortDescription description = grdData.Items.SortDescriptions[0];
grdData.ItemsSource = null;
grdData.ItemsSource = Data;
grdData.Items.SortDescriptions.Add(description);
if(description.PropertyName=="Value")
{
    grdData.Columns[1].SortDirection = description.Direction;
}
else
{
    grdData.Columns[0].SortDirection = description.Direction;
}

但这完全是黑客行为。有什么更好的办法吗?

WPF数据网格中的度假区数据

这有点棘手,很大程度上取决于底层数据源,但我要做的是:

首先,也是最重要的一点,您需要一个可排序的数据类型。为此,我创建了一个"SortableObservableCollection",因为我的底层数据类型是ObservableCollection:

public class SortableObservableCollection<T> : ObservableCollection<T>
{        
    public event EventHandler Sorted;       
    public void ApplySort(IEnumerable<T> sortedItems)
    {
        var sortedItemsList = sortedItems.ToList();
        foreach (var item in sortedItemsList)
            Move(IndexOf(item), sortedItemsList.IndexOf(item));       
        if (Sorted != null)
            Sorted(this, EventArgs.Empty);
    }
}

现在,有了它作为数据源,我可以在DataGrid上检测排序并使用实际数据。为此,我在DataGrid的Items的CollectionChanged事件中添加了以下事件处理程序:

... In the constructor or initialization somewhere
ItemCollection view = myDataGrid.Items as ItemCollection;
((INotifyCollectionChanged)view.SortDescriptions).CollectionChanged += MyDataGrid_ItemsCollectionChanged;
...
private void MyDataGrid_ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // This is how we detect if a sorting event has happend on the grid.
    if (e.NewItems != null &&
        e.NewItems.Count == 1 &&
        (e.NewItems[0] is SortDescription))
    {
        MyItem[] myItems = new MyItem[MyDataGrid.Items.Count]; // MyItem would by type T of whatever is in the SortableObservableCollection
        myDataGrid.Items.CopyTo(myItems, 0);
        myDataSource.ApplySort(myItems);  // MyDataSource would be the instance of SortableObservableCollection
    }
} 

这比使用SortDirection效果好一点的原因之一是在进行组合排序的情况下(在对列进行排序时按住shift,你就会明白我的意思)。