我有一个DataGrid
,它通过Thread
每隔几秒钟更新一次数据。 DataGrid
需要提供列标题排序,分组和过滤。
我目前有一个DataGrid
绑定(bind)到ICollectionView
,并且ICollectionView
的来源是ObservableCollection
。从我在其他线程上阅读的内容来看,这似乎是实现此目的的好方法。
排序“有效”,但是当ICollectionView.Source
更新之后更新ObservableCollection
时,它会丢失。我尝试在更新之前保存SortDescriptions
,并在更新完成后将其重新添加到ICollectionView
。但这是相同的结果。
有人可以指出我所缺少的吗?
编辑这是一些代码...
查看(XAML)
<DataGrid ItemsSource="{Binding CollectionView, Source={StaticResource ViewModel}}>
View 模型
public ICollectionView CollectionView
{
get
{
collectionViewSource.Source = dataColl;
if (SortDescriptions != null)
{
foreach (SortDescription sd in SortDescriptions)
{
collectionViewSource.View.SortDescriptions.Add(sd);
}
}
collectionViewSource.View.Refresh();
return collectionViewSource.View;
}
}
public ObservableCollection<SomeObject> DataColl
{
get { return dataColl; }
private set
{
this.dataColl= value;
OnPropertyChanged("CollectionView");
}
}
以下是每几秒钟更新一次数据的方法...
private void UpdateData()
{
while (true)
{
System.Threading.Thread.Sleep(mDataRefreshRate);
// SortDescriptions is a Property of the ViewModel class.
SortDescriptions = collectionViewSource.View.SortDescriptions;
ObservableCollection<SomeObject> wDataColl
= new ObservableCollection<SomeObject>();
//... Irrelevant code that puts the data in wDataColl ...
DataColl= wDataColl;
}
}
最佳答案
[YourObservableCollection].ViewHandler.View.Filter
+= new FilterEventHandler(myFilterHandler);
private void myFilterHandler(object sender, FilterEventArgs e)
{
}
可用于直接添加过滤器处理程序,也可以使用
SortDescriptions
进行相同操作以添加/删除[YourObservableCollection].ViewHandler.View.SortDescriptions.Add(mySortDescription);
如果您要最好地进行排序和过滤,以创建自己的类来封装CollectionViewSource并实现添加和删除
SortDescriptions
和Filtering等当你说:
更新是什么意思?您的意思是您要更改源?而不是从集合中添加/删除项目?
根据您添加的XAML示例进行编辑:
<DataGrid ItemsSource="{Binding CollectionView, Source={StaticResource ViewModel}}>
您正在将itemsource绑定(bind)到CollectionViewSource,在其中应将datacontext绑定(bind)到它:
例子:
<Page.Resources>
<CollectionViewSource x:Key="myViewSource"
Source="{Binding CollectionView, Source={StaticResource ViewModel}}"
/>
</Page.Resources>
在页面中:
<Grid DataContext="{StaticResource myViewSource}">
<DataGrid x:Name="myGrid" ItemsSource="{Binding}"...
或类似的规定
编辑再次没有看到代码向下滚动:p
ObservableCollection<SomeObject> wDataColl= new ObservableCollection<SomeObject>();
每次收集时您都会创建新实例,这是主要问题
还:
public ICollectionView CollectionView
{
get
{
collectionViewSource.Source = dataColl;
if (SortDescriptions != null)
{
foreach (SortDescription sd in SortDescriptions)
{
collectionViewSource.View.SortDescriptions.Add(sd);
}
}
collectionViewSource.View.Refresh();
return collectionViewSource.View;
}
}
在这里,您返回集合时,您需要设置
Source
并添加SortDescriptions
并每次都刷新 View ,您只需要设置一次这些值如果您添加/删除
SortDescriptions
,则只会在 View 上调用刷新我认为您应该掌握CollectionViewSource的基础知识
关于c# - MVVM动态DataGrid排序过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16200622/