将子节点绑定到CollectionViewSource

时间:2019-05-15 13:54:13

标签: wpf xaml treeview collectionviewsource

这是我的数据结构:

MyViewModel
  Docs (ObservableCollection<Doc>)
    Specs (ObservableCollection<Spec>)

即ViewModel有一个名为ObservableCollection的{​​{1}},它是Docs对象的集合,每个Doc对象又有Doc对象的集合。名为Spec的属性(在Doc和Spec类中都可用)存储每个文档/规范的逻辑位置。

我现在需要将此结构绑定到position。我需要始终保持对文档和规范都进行排序(TreeView支持节点的拖放重排),因此直接绑定在这里不起作用。

因此,我使用TreeView在运行时执行排序。

CollectionViewSource

并在我的TreeView中使用它:

<CollectionViewSource x:Key="DocumentsCVS" Source="{Binding Docs}">
  <CollectionViewSource.SortDescriptions>
    <componentmodel:SortDescription PropertyName="position" />
  </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

到目前为止,一切都很好。 TreeView显示我的文档已排序。

但是从现在开始,事情变得混乱了。如何/在何处为规格创建<TreeView ItemsSource="{Binding Source={StaticResource DocumentsCVS}}"> ?我尝试在自己的CollectionViewSource中这样做:

HierarchicalDataTemplate

但这不起作用。 <HierarchicalDataTemplate> <HierarchicalDataTemplate.ItemsSource> <Binding> <Binding.Source> <CollectionViewSource Source="{Binding Specs}"> <CollectionViewSource.SortDescriptions> <componentmodel:SortDescription PropertyName="position" /> </CollectionViewSource.SortDescriptions> </CollectionViewSource> </Binding.Source> </Binding> </HierarchicalDataTemplate.ItemsSource> </HierarchicalDataTemplate> 中仅列出文档,内部没有子项。我的直觉是TreeView与父CollectionViewSource可能不在同一个DataContext中。

这还是其他吗?

编辑

这是我的TreeView的完整XAML:

TreeViewItem

1 个答案:

答案 0 :(得分:1)

<CollectionViewSource Source="{Binding Specs}">

那里的Source Binding不知道在哪里寻找DataContext(没有“框架指导者”)。我已经踢了一下。我找不到一个定义CollectionViewSource的地方,该地方它从模板继承DataContext。

我确实找到了解决方案。

C#

public class SortConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var view = CollectionViewSource.GetDefaultView(value);
        view.SortDescriptions.Add(new SortDescription((string)parameter, ListSortDirection.Ascending));
        return view;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

XAML

<HierarchicalDataTemplate 
    DataType="{x:Type vm:DocumentVM}" 
    ItemsSource="{Binding Specs, Converter={StaticResource SortConverter}, ConverterParameter=position}"
    >

通过为转换器提供多个PropertyName / SortDirection属性或SortDescriptions的集合,可以使此操作更有用。您可以将其设置为MarkupExtension。您也可以只在viewmodel属性中创建集合视图。