5

是否可以在數據模板中顯式使用CollectionViewSource?通常情況下,我們會將CollectionViewSource與模板中的資源放在一起,但我們的模型不允許這樣做,因爲collectionviewsource的「源」是樹中此級別的DataContext的屬性,這意味着需要有一個實例在這個級別。把它放在資源的根部意味着只有一個實例。我們也不能簡單地在外層使用分組,因爲這些項目不存在,直到你處於層次結構的下層,並且並非所有的同胞都擁有這個屬性。因此,從邏輯上講,我們在DataTemplate中實例化CollectionViewSource(在本例中爲HierarchicalDataTemplate,但這無關緊要)。你可以在DataTemplate中使用CollectionViewSource嗎?

具體而言,我們試圖在此特定節點級別上進行特定排序。我們唯一的選擇是在ViewModel本身進行排序,但由於我們使用的ObservableCollections本身不支持排序,所以這成爲一種痛苦。實際上,我們在該主題上看到的每篇文章都聲明,您應該恰好使用CollectionViewSource,因此就是這個問題。

例如,這個工程......

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}" 
    ItemsSource="{Binding Symbols}"> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

但這並不...

<HierarchicalDataTemplate x:Key="CategoryTemplate" 
    ItemTemplate="{StaticResource TreeViewSymbolTemplate}"> 

    <HierarchicalDataTemplate.ItemsSource> 
     <Binding> 
      <Binding.Source> 
       <CollectionViewSource Source="{Binding Symbols}" /> 
      </Binding.Source> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 

    <TextBlock Text="{Binding Name}" FontWeight="Bold" /> 

</HierarchicalDataTemplate> 

像它會在我看來,但事實並非如此。同樣,我們不能將CollectionViewSource與數據模板放在同一級別,因爲每個模板需要一個實例,因爲每個模板都有自己的一組項目(儘管它們都將共享排序條件。)

M

+0

真的想在這裏更合適得到一個答案,做它的原始的方式,或者即使CollectionViewSource是DataTemplate中的資源部分內。 – 2010-12-29 12:07:41

+1

實際上,我發現了一個更簡單的方法來做到這一點,我真的很喜歡...我只是將CollectionViewSource移動到一個轉換器中,並使用它來設置返回值。現在我們只是在裝訂時「新」起來,因爲這是我們需要做的,但從技術上講,我們可以返回我們在需要時參考的預先水合的。如果你問我並像冠軍一樣工作,該死的太漂亮了! – MarqueIV 2011-01-02 07:18:15

+0

我會研究一下。謝謝。 – 2011-01-04 09:10:04

回答

3

好吧...所以這不是我想要做的,但結果是完全一樣的,沒有人甚至評論,更不用說回答了,因此我把這個作爲一個。

我們需要做到這一點的最初原因是有節點特定的排序。雖然我們從來沒有讓CollectionViewSource工作,但我們確實設法直接將排序應用到節點。訣竅是在節點創建時或者我們正在做,節點擴展時(我們正在使用綁定,所以我們不會手動創建節點)。

請注意,我們的實際代碼如果我們已經將該類應用於所討論的節點,那麼它就會跟蹤,因此它不會在每個'Expanded'事件上執行,但是該代碼與此問題無關,所以爲了簡潔起見,我省略了它。不過,你應該添加類似的東西。

總之,這裏是你如何可以爲每個節點做整理...

private void tvSymbols_Expanded(object sender, RoutedEventArgs e) { 

    TreeViewItem node = e.OriginalSource as TreeViewItem; 
    if(node==null) return; 
    node.Items.SortDescriptions.Clear(); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeField",  ListSortDirection.Ascending)); 
    node.Items.SortDescriptions.Add(new SortDescription("SomeOtherField", ListSortDirection.Descending)); 

} 

當然,如果還有人計算出,爲什麼原題的代碼沒有工作,還是讓我知道了!

馬克

相關問題