[英]When is CollectionViewSource.Filter event raised in WPF?
[英]CollectionViewSource.Filter doesn't work
我的应用程序中有一个包含以下资源的窗口:
<Window.Resources>
<ResourceDictionary>
<Data:IssueRecords x:Key="DataSource"/>
<CollectionViewSource x:Key="DataCollection" Source="{StaticResource DataSource}"
Filter="CollectionViewSource_Filter">
</CollectionViewSource>
</ResourceDictionary>
</Window.Resources>
有一个标准的事件处理程序 - 一个名为CollectionViewSource_Filter和DataGrid的方法,用于应用过滤器。 加载窗口后,包括滤镜在内的所有内容均正常运行。
为了应用过滤器,我调用ReloadGrid方法...
private void ReloadGrid(object sender, RoutedEventArgs e)
{
CollectionViewSource.GetDefaultView(GridData.ItemsSource).Refresh();
}
但是,当用户执行任何操作(对数据库进行更改(删除,修改或创建新操作))时,我需要重新加载这些数据源,因此我致电...
private void ReloadDataSources()
{
var dataSource = this.FindResource("DataSource") as IStockRecords;
dataSource.ReloadData();
var dataCollection = this.FindResource("DataCollection") as CollectionViewSource;
dataCollection = new CollectionViewSource() { Source = dataSource };
dataCollection.Filter += new FilterEventHandler(CollectionViewSource_Filter);
Binding binding = new Binding() { Source = dataCollection };
BindingOperations.SetBinding(GridData, DataGrid.ItemsSourceProperty, binding);
}
我想,我做了所有事情,从数据库中读取实际数据并在窗口中重新加载数据源需要什么。 但是,当我使用任何过滤器时,在调用ReloadDataSources()之后,不再使用过滤器事件。 我调试了源代码,并且即使设置了FilterEventHandler,Refresh方法也不会调用CollectionViewSource_Filter。
我错过了什么吗? 谢谢,JiKra
修改数据源后,需要重置默认视图。
CollectionViewSource.GetDefaultView(GridData.ItemsSource).Refresh();
尝试这个....
private void ReloadDataSources()
{
var dataSource = this.FindResource("DataSource") as IStockRecords;
dataSource.ReloadData();
var dataCollection = this.FindResource("DataCollection") as CollectionViewSource;
// Remove the current event handler
dataCollection.Filter -= new FilterEventHandler(CollectionViewSource_Filter);
// Set your new data source
dataCollection = new CollectionViewSource() { Source = dataSource };
// Read your handler
dataCollection.Filter += new FilterEventHandler(CollectionViewSource_Filter);
// Now reset your filter
dataCollection .GetDefaultView(GridData.ItemsSource).Refresh();
Binding binding = new Binding() { Source = dataCollection };
BindingOperations.SetBinding(GridData, DataGrid.ItemsSourceProperty, binding);
}
好的,当我重新创建CollectionViewSource对象时似乎有问题。 所以,最终版本是......
private void ReloadDataSources()
{
var dataSource = this.FindResource("DataSource") as IStockRecords;
dataSource.ReloadData();
var dataCollection = this.FindResource("DataCollection") as CollectionViewSource;
//here I just had to refresh collection's view, not to create a new one
dataCollection.View.Refresh();
Binding binding = new Binding() { Source = dataCollection };
BindingOperations.SetBinding(GridData, DataGrid.ItemsSourceProperty, binding);
}
谢谢你们的努力... JiKra
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.