2010-09-28 109 views
0

我爲過濾而設計的設計充其量是最尷尬的,最壞的情況是錯誤的。這個想法是有一個基類來支持選擇列表,並讓子類根據需要添加額外的過濾邏輯。CollectionViewSource過濾邏輯

對我來說特別令人困惑的是如何觸發視圖以隨着各種過濾條件的變化進行過濾(請參閱下面的_ApplyFiler())。設置過濾器是否合適?我應該在哪裏過濾後取消訂閱/將其設置爲空?

乾杯, Berryl

醜陋的代碼:

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; 
    } 

} 
+0

什麼是你的問題? – 2010-09-28 22:09:55

+0

詳情,詳情: - )。請參閱編輯過的文章! – Berryl 2010-09-28 23:12:21

回答

1

有幾件給我失蹤了,所有具有刷新的CollectionView說是做圖的不平凡的操作該CollectionViewSource的屬性:

我的問題的第一部分是,當設置過濾器。對於我的用例來說,到目前爲止效果最好的結果是註冊了CollectionViewSource.Filter事件,然後每次更改過濾器時都使用View.Refresh方法。過濾器事件的初始註冊也會觸發事件處理程序,並且您看到的許多msdn示例都將其顯示爲過濾視圖的一種方式,除此之外別無其他。但是如果你的場景不是微不足道的&用戶可以改變一些過濾標準,你需要使用一個或多個上述刷新相關的方法&屬性。

我的問題的第二部分與是否需要取消訂閱過濾器事件有關,如果有,何時取消訂閱。那麼,事實證明,你不需要需要退訂,但如果你這樣做,它有效地清除視圖的任何過濾。許多msdn平凡的樣本完全可以清除過濾器,如果您想要完全清除過濾器,這肯定是一種方法,但對我的用例來說並不是我真正想要的。我想要的是清除一些標準,而不是其他人,所以再次使用刷新(在正確的時間)給了我想要的行爲。

HTH,
Berryl