Таблица данных не обновляется при изменении свойства элемента для фильтра - PullRequest
2 голосов
/ 22 июня 2010

У меня есть простая форма с сеткой данных и кнопкой.Элементы в сетке данных связаны с ObservableCollection из customers.customer реализует интерфейс INotifyPropertyChanged.Каждый клиент имеет свойство deleted (тип bool).Я установил фильтр для представления клиентов по умолчанию, чтобы отфильтровывать удаленных клиентов на основе свойства deleted.Пока это работает.

Затем я добавляю событие для кнопки, которая помечает выбранного клиента как удаленного.Проблема в том, что сетка не обновляется после установки selected_customer.deleted = true.Удаленный клиент все еще виден.Столбец, связанный с deleted свойством, корректно обновляется.Чтобы удалить клиента из сетки, мне нужно вручную вызвать Refresh() метод представления клиентов по умолчанию.

Почему сетка данных не обновляется автоматически, когда я использую ObservableCollection и клиент реализует интерфейс INotifyPropertyChanged?Как заставить его обновляться автоматически?

1 Ответ

0 голосов
/ 22 июня 2010

Я предполагаю, что вы используете CollectionViewSource для фильтрации. Приведенный ниже код будет подписываться на изменения в свойстве «Удаленные» клиента и обновлять источник Collectioviews при удалении изменений. Customers - это ObservableCollection класса Customer. Клиент имеет свойство bool с именем Deleted и реализует INotifyPropertyChanged. InitAutoRefresh () должен вызываться перед заполнением клиентов.

private void InitAutoRefresh(ObservableCollection<Customer> observableCollection, CollectionViewSource collectionViewSource)
{
    observableCollection.CollectionChanged += 
        (sender, e) =>
        {
            foreach(Customer newItem in e.NewItems)
            {
                newItem.PropertyChanged += 
                    (sender2, e2) =>
                    {
                        if (e2.PropertyName == "Deleted")
                        {
                            collectionViewSource.View.Refresh();
                        }
                    };
            }
        };
}

Позвоните, прежде чем заполнять наблюдаемую коллекцию. Если вы объявили свой collectionViewSource в XAML, вы можете использовать FindResource для получения экземпляра.

InitAutoRefresh(Customers, FindResource("cvsCustomers") as CollectionViewSource);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...