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;
}
但这完全是黑客行为。有什么更好的办法吗?
这有点棘手,很大程度上取决于底层数据源,但我要做的是:
首先,也是最重要的一点,您需要一个可排序的数据类型。为此,我创建了一个"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,你就会明白我的意思)。