繁体   English   中英

CollectionViewSource.Filter不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM