我有一个简单的集合,可以实时更新。数据显示在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;
}
但这完全是黑客攻击。什么事情都有更好的结果?
答案 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好一点的原因之一是在组合排序的实例中(在对列进行排序时保持向下移动,你会看到我的意思)。