当前位置:  开发笔记 > 编程语言 > 正文

ListBox ItemsSource动态过滤器WPF

如何解决《ListBoxItemsSource动态过滤器WPF》经验,为你挑选了2个好方法。

我想通过数据源进行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 ObservableCollection Authors
   {
      get
      {
         return new ObservableCollection(_bookRepository.FindAllAuthors());
      }
   }

   public Author FilterAuthorBy
   {
       get
       {
           return _filterAuthorBy;
       }
       set
       {
           _filterAuthorBy = value;
           _books.View.Refresh();
       }
    } 
}

选定的作者传递给ViewModel,并通过调用collectionViewSource.View.Refresh()更新列表框

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有