来自Converter的HierarchicalDataTemplate参考TreeViewItem

时间:2010-12-11 00:18:43

标签: binding treeview converter treeviewitem

我需要根据父树视图的高度调整我的treeviewitems的边距。我试图在hierarchicaldatatemplate中添加一个转换器到stackpanel,但它没有给我任何方法来访问转换器convertTo方法中的treeviewitem。

    <UserControl.Resources>

    <converter:LocationConverter x:Name="LocationConverter1" x:Key="LocationConverter1" />

    <sdk:HierarchicalDataTemplate x:Key="DataTemplate1" ItemsSource="{Binding SubCategory}">

            <StackPanel Margin="{Binding Converter={StaticResource LocationConverter1}}">

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

            </StackPanel>

        </sdk:HierarchicalDataTemplate>

    </UserControl.Resources>

<Grid x:Name="LayoutRoot">
    <custom:TreeViewExtended x:Name="TopicsTreeView"  
                             HorizontalAlignment="Left" 
                             VerticalAlignment="Top" 
                             ItemTemplate="{StaticResource DataTemplate1}"/>

    <Button Content="Add" Click="Button_Click" Margin="200"></Button>



</Grid>

有没有办法将treeView实例作为converterParameter传递给convertTo方法,以便我可以在转换器方法中按名称找到treeviewitems?

由于

1 个答案:

答案 0 :(得分:0)

我不知道将TreeView实例作为ConverterParameter放置的好方法(Googling ConverterParameter会产生some interesting ideas如何achieve this ...),但我认为你的方法是错误的 - 而不是将整个树视图传递给转换器,然后按名称查找TreeViewItems,为什么不将TreeViewItem传递给Margin绑定,转换器将搜索可视化树并查找所需的高度?

这可以这样做:

<StackPanel Margin="{Binding RelativeSource={RelativeSource FindAncestor, 
                                                            AncestorType=TreeViewItem},
                             Converter={StaticResource LocationConverter1}}">

现在,您的转换器的value参数将是当前的 TreeViewItem 。通过此值,您可以使用VisualTreeHelper获取TreeView实例,或者甚至更好地获取父TreeViewItem(如果存在)。