Уведомление WPF DataGrid об изменениях

#c# #wpf #entity-framework #data-binding #datagrid

#c# #wpf #entity-framework #привязка данных #datagrid

Вопрос:

У меня есть DataGrid привязка к ICollectionView (с включенным фильтром). Более конкретно, я установил, view.Filter = SomeFilteringFunction которое использует public DateTime DateFrom { get... set... } свойство, также привязанное к DatePicker .

Что ж, и теперь, когда я меняю DatePicker свойство bound DateFrom , оно правильно изменено, но сетка данных явно не фильтруется повторно.

Каков наиболее правильный способ уведомления DataGrid об обновлении?

Заранее благодарю вас!

Джеймс

Ответ №1:

Вы не должны привязываться непосредственно к ICollectionView, скорее вы привязываетесь к исходной коллекции, а затем применяете фильтр к ICollectionView, возвращаемому CollectionViewSource.GetDefaultView.

 <DataGrid ItemsSource="{Binding MyCollection}" />
  
 // should raise INotityPropertyChange.PropertyChanged
public ObservableCollection<Entity> MyCollection { get; set; }

MyCollection = new ObservableCollection<Entity>(ctx.EntitySet)); 
ICollectionView view = CollectionViewSource.GetDefaultView(MyCollection);
view.Filter = SomeFilteringFunction;
  

Затем, когда изменяется значение DatePicker, вам нужно сообщить ICollectionView об обновлении.

 ICollectionView view = CollectionViewSource.GetDefaultView(MyCollection);
view.Refresh();
  

Комментарии:

1. Большое вам спасибо, но я не понимаю, к чему я должен привязываться. Я привязываю к: list = CollectionViewSource.GetDefaultView(new ObservableCollection<Entity>(ctx.EntitySet));

Ответ №2:

Вы можете подписаться на PropertyChanged событие (которое, я полагаю, вы реализовали в классе) и обновить представление в обработчике:

 var view = CollectionViewSource.GetDefaultView(Collection);
if (view != null)
{
    view.Refresh();
}
  

Не уверен, что есть более чистый способ, но я совершенно уверен, что вам нужно сделать этот Refresh вызов в какой-то момент.