2011-05-02 58 views
0

我有一個TagTypeController類,它爲WPF UserControl的控制器提供一個集合視圖,該控件包含對集合視圖的私有引用。CollectionView.Filter的謂詞<Object>可以在不同的類中嗎?

_ttController = new TagTypeController(_isProd); 
CollectionView tagTypeList = _ttController.getTagTypes(); 

在TagTypeController,創建的CollectionView時,我設置濾波器代表

if (_tagTypeList == null) 
    _tagTypeList = new CollectionView(CollectionViewSource.GetDefaultView(_tagTypeTable)); 
    _tagTypeList.Filter = new Predicate<object>(filterTagTypes); 

我想以定位TagTypeController類用於濾波,其的CollectionView的所有的邏輯等。 。問題是,當UserControl的TextBox中的文本發生更改時,我通過委派給UserControl的控制器來響應該事件。當我要求tagTypeList刷新時,它不會調用filterTagTypes方法。是否有可能在不同的類中使用過濾器委託?

謝謝。

編輯:添加請求的代碼

//parse the string to get just the portion after the last comma and space 
Int32 _lastComma = _tempText.LastIndexOf(","); 
_ttController.searchText = _tempText.Substring(_lastComma + 1).Trim(); 

tagTypeList.Refresh(); 
+0

你對文本框有不同的控制器嗎?你也可以發佈刷新tagTypeList的代碼。我認爲這有助於澄清這個問題。 – 2011-05-02 22:21:45

+0

有兩個控制器。一個用於UserControl,因此擴展名爲TextBox。另一個管理TagTypes的數據模型,這就是提供CollectionView和進行過濾的控制器。我已編輯發佈刷新代碼。 – Shawn 2011-05-03 15:25:57

回答

1

我認爲這個問題可能是您正在使用的過濾謂詞,而不是事件。如果你看一下CollectionView文檔,它說:

如果您的視圖對象來自一個 CollectionViewSource對象,通過設置一個事件 處理程序篩選事件適用 過濾邏輯。

因此,而不是設定您想要使用的事件處理程序,使代碼看起來像

_tagTypeList.Filter += FilterTagTypesHandler; 

其中FilterTagTypesHandler就像

private void FilterTagTypesHandler(object sender, FilterEventArgs e){ 
    //do filtering 
} 

另一種可能性中定義的屬性是你正在創建一個新的CollectionView而不是鑄造GetDefaultView()的結果。當你這樣做時,你可能會失去與控制的聯繫。如果你看看CollectionViewSource's documentation,推薦使用它的方式是

myCollectionView = (CollectionView) 
    CollectionViewSource.GetDefaultView(rootElem.DataContext); 
+0

我最初嘗試了你的第一個建議(我讀了相同的MSDN文檔),但是我得到了operator + =不能應用於System.Predicate 和method group類型的操作數。我不確定爲什麼我按照我的方式編寫我的代碼獲取CollectionView。我一直都是按照你的建議寫的。以此方式編寫並使用謂詞編譯,但會引發NotSupportedException。 – Shawn 2011-05-03 15:10:24

+0

我發現了一種解決方法,儘管我很想知道發生了什麼。我將DataTable中的所有行添加到了一個通用List <>中,然後將List <>的默認視圖添加到我的CollectionView中。謂詞過濾現在起作用。 – Shawn 2011-05-03 15:21:36

+0

@Shawn我建議你不要使用謂詞,而是使用事件處理函數作爲右側操作符。我對你的工作有點困惑。您是否將CollectionViewSource的源設置爲列表,但是如果將其設置爲DataTable,則不起作用? – 2011-05-04 03:44:58