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

} 

当然,如果还有人计算出,为什么原题的代码没有工作,还是让我知道了!

马克

相关问题