#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
вызов в какой-то момент.