这是我的数据结构:
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
答案 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属性中创建集合视图。