WPF DataGrid中的度假数据

时间:2011-06-27 16:39:20

标签: c# wpf datagrid

我有一个简单的集合,可以实时更新。数据显示在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;
}

但这完全是黑客攻击。什么事情都有更好的结果?

1 个答案:

答案 0 :(得分:1)

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

首先,您需要一种可排序的数据类型。为此,我创建了一个“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好一点的原因之一是在组合排序的实例中(在对列进行排序时保持向下移动,你会看到我的意思)。