CollectionViewSource.Filter не работает - PullRequest
1 голос
/ 10 февраля 2012

В моем приложении есть окно со следующими ресурсами:

 <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 () событие фильтра больше не используется.Я отлаживал исходный код, и метод Refresh не вызывает CollectionViewSource_Filter, даже когда я устанавливаю FilterEventHandler ...

Я что-то пропустил?Спасибо, JiKra

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вам необходимо сбросить вид по умолчанию после изменения источника данных.

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);
}
1 голос
/ 11 февраля 2012

ОК, похоже, проблема при воссоздании объекта 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

...