代码之家  ›  专栏  ›  技术社区  ›  Berryl

CollectionViewSource筛选逻辑

  •  0
  • Berryl  · 技术社区  · 15 年前

    我提出的过滤设计,充其量是笨拙的,最糟糕的是bug。这样做的目的是让基类支持一个选择列表,并让子类根据需要添加额外的过滤逻辑。

    干杯, 贝里尔

    public class SubjectPickerBase<T> : ViewModelBase, ISubjectPicker<T> 
        where T : class, IAvailableItem, INotifyPropertyChanged, IActivitySubject
    {
        public CollectionViewSource Subjects { get; private set; }
    
        protected SubjectPickerBase() { }
    
        protected void _Initialize(IEnumerable<T> subjects, string subjectName) {
            ...
    
            Subjects = new CollectionViewSource { Source = subjects };
            _ApplyFilter();
        }
    
        protected void _ApplyFilter() {
            Subjects.View.Filter += Filter;
        }
    
        private bool Filter(object obj)
        {
            var subject = obj as T;
            if (ReferenceEquals(subject, null)) return false;
    
            NotifyPropertyChanged(() => Status);
    
            var isIncludedBySubclass = OnFilter(subject);
            var isIncludedByBase = subject.IsAvailable;
            return isIncludedByBase & isIncludedBySubclass;
        }
    
        /// <summary>Hook to allow implementing subclass to provide it's own filter logic</summary>
        protected virtual bool OnFilter(T subject) { return true; }
    
    
     }
    
    public class ProjectSelectionViewModel : SubjectPickerBase<ProjectViewModel>
    {
    
        public ProjectSelectionViewModel(IEnumerable<ProjectViewModel> projects) 
        {
            ...
            _Initialize(projects, Strings.ActivitySubject__Project);
        }
    
        public string DescriptionMatchText {
            get { return _descriptionMatchText; }
            set {
                ApplyPropertyChange<ProjectSelectionViewModel, string>(ref _descriptionMatchText, x => x.DescriptionMatchText, value);
                _ApplyFilter();
            }
        }
        private string _descriptionMatchText;
    
        protected override bool OnFilter(ProjectViewModel subject)
        {
            ...
            var isDescriptionMatch = subject.IsMatch_Description(DescriptionMatchText);
            return isPrefixMatch && isMidfixMatch && isSequenceNumberMatch && isDescriptionMatch;
        }
    
    }
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Berryl    15 年前

    对于我所缺少的视图的非平凡操作,有几个部分与刷新CollectionView有关,CollectionView是CollectionViewSource的一个属性:

    我的问题的第二部分涉及是否需要取消订阅筛选事件,如果需要,何时取消订阅。嗯,事实证明你没有 需要

    嗯,