Я хочу сделать виртуализацию пользовательского интерфейса через источник данных.
Идея состоит в том, чтобы «фильтровать» то, что я посылаю в пользовательский интерфейс (список в моем случае).
Я заметил, что ItemsSource (наблюдаемая коллекция) читается один раз и что изменение фильтра не вызывает обновления ...
Я не понимаю, почему
Спасибо
Jonathan
Я постараюсь быть более ясным:
У меня есть CollectionViewSource:
<CollectionViewSource x:Key="MyItemView"
Source="{Binding Path=Model.CurrentItem}" />
Затем используйте этот источник данных в моем ListBox:
<ListBox x:Name="myListBox"
ItemsSource="{Binding Source={StaticResource MyItemView}}"
Я подумал реализовать конвертер, который бы возвращал отфильтрованную коллекцию (основываясь на текущей дате):
<ListBox x:Name="myListBox"
ItemsSource="{Binding Source={StaticResource MyItemView}, Converter={StaticResource FilterByTime}, ConverterParameter=CurrentDate }"
Что я реализовал так:
public class FilterByTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null)
{
System.Windows.Data.ListCollectionView list = value as System.Windows.Data.ListCollectionView;
var model = DI.Resolve<ApplicationModel>();
list.Filter = delegate(object item)
{
bool r= (((MyModel)item).OriginalDate > model.TimeLine.CurrentDate.AddMonths(-1)
&& (((MyModel)item).OriginalDate < model.TimeLine.CurrentDate.AddMonths(1)));
// Console.WriteLine ("{0}<{1}<{2} : {3}",model.MyListBox.CurrentDate.AddMonths(-1),((MyModel)item).OriginalDate ,model. MyListBox.CurrentDate.AddMonths(1),r.ToString());
return r;
};
return list;
}
return DependencyProperty.UnsetValue;
}
Это работает нормально ... но только когда прыгаешь в первый раз.
При изменении текущей даты и изменении фильтра список не обновляется.
Возможно, мне стоит послушать CurrentDate PropertyChange, но я запутался, как это сделать
Спасибо
Jonathan