我想通过数据源进行UI虚拟化.
我的想法是"过滤"我发送到UI的内容(在我的情况下是一个列表框).
我注意到ItemsSource(一个可观察的集合)被读取一次并且更改过滤器不会触发刷新...
我不明白为什么感谢乔纳森
我会试着更清楚:
我有CollectionViewSource:
然后在我的ListBox中使用此数据源:
我想实现一个转换器,它将返回一个过滤的集合(基于当前日期):
我用这种方式实现了:
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(); 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,但我很困惑如何做到这一点
谢谢乔纳森
1> Kent Boogaar..:它
CollectionViewSource
本身支持通过其Filter
属性进行过滤.你为什么不把过滤逻辑放在那里?
2> Arunas..:好吧,我有类似的问题,但附带以下适用于我的解决方案:
据说,组合框显示作者列表和列表框所有书籍,我想按选定的作者过滤书籍或显示未过滤的所有书籍.
相关窗口XAML片段:
绑定本身就像在窗口构造函数上这样完成:
DataContext = new BookViewModel(this);视图模型定义如下:
public class BookViewModel { private Author _filterAuthorBy; public BookViewModel(IBookView view) { ... _books = new CollectionViewSource(); _books.Source = _bookRepository.FindAll().ToArray(); _books.Filter += (sender, e) => { Book book = e.Item as Book; if (_filterAuthorBy == null) { e.Accepted = true; } else { e.Accepted = book.Authors.Contains(_filterAuthorBy); } }; } public CollectionView Books { get { return _books.View; } } public ObservableCollectionAuthors { get { return new ObservableCollection (_bookRepository.FindAllAuthors()); } } public Author FilterAuthorBy { get { return _filterAuthorBy; } set { _filterAuthorBy = value; _books.View.Refresh(); } } } 选定的作者传递给ViewModel,并通过调用collectionViewSource.View.Refresh()更新列表框