代码之家  ›  专栏  ›  技术社区  ›  rasx

HierarchycalDataTemplate和HeaderedItemsControl与ControlTemplate无法显示嵌套数据

  •  2
  • rasx  · 技术社区  · 16 年前

    我可以用这个模式 Menu TreeView 但当我尝试用它的时候,我肯定错过了什么 HeaderedItemsControl :

    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Page.Resources>
    
        <HierarchicalDataTemplate x:Key="MenuItemTemplate" ItemsSource="{Binding XPath=foo}">
            <AccessText Text="{Binding XPath=@a}" />
        </HierarchicalDataTemplate>
    
        <Style TargetType="HeaderedItemsControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
                        <StackPanel>
                            <ContentPresenter ContentSource="Header"/>
                            <ItemsPresenter Margin="10,0,0,0" />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <XmlDataProvider x:Key="RootXml" XPath="/root/foo">
            <x:XData>
                <root xmlns="">
                    <foo a="one">
                        <foo a="two" b="wow, two" />
                        <foo a="three" b="wow, three" />
                        <foo a="four" b="wow, four" />
                    </foo>
                    <foo a="one again">
                        <foo a="two others" b="wow, two others" />
                        <foo a="three the hard way" b="wow, three again" />
                    </foo>
                </root>
            </x:XData>
        </XmlDataProvider>
    
    </Page.Resources>
    
    <StackPanel>
        <HeaderedItemsControl
            Header="My Foo List"
            ItemTemplate="{Binding Source={StaticResource MenuItemTemplate}}"
            ItemsSource="{Binding Source={StaticResource RootXml}}">
        </HeaderedItemsControl>
    </StackPanel>
    </Page>
    

    My foo list
        one
        one again
    

    我需要和你做点什么吗 ControlTemplate 要使数据正确显示?或者我需要更详细的(或额外的) HierarchicalDataTemplate ? 另外:我们如何展示 foo/@b 数据

    3 回复  |  直到 16 年前
        1
  •  3
  •   Spevy    13 年前

    这是一个迟来的答案。我也一直在尝试解决这个问题,但对上述答案和/或链接答案中的推理不满意,因为所有控件之间的XAML模式应该是相同的。

    使用jetbrains dotPeek一段时间后,combing认为TreeView控件的答案最终相当简单。TreeView和TreeView项目覆盖 IsItemItsOwnContainerOverride GetContainerForItemOverride 到将容纳孩子的控件(TreeView案例中的TreeView项)。您可以创建两个简单的自定义控件来处理此问题。

    你的 头部垂直控制 类应该是这样的:

    public class MyHierarchicalViewItem : HeaderedItemsControl
    {
        protected override bool IsItemItsOwnContainerOverride(object item)
        {
            return item is MyHierarchicalViewItem;
        }
    
        protected override DependencyObject GetContainerForItemOverride()
        {
            return (DependencyObject)new MyHierarchicalViewItem();
        }
    }
    

    public class MyHierarchicalView:ItemsControl 
    {
        protected override bool IsItemItsOwnContainerOverride(object item)
        {
            return item is MyHierarchicalViewItem;
        }
    
        protected override DependencyObject GetContainerForItemOverride()
        {
    
            return (DependencyObject) new MyHierarchicalViewItem();
        }
    }
    

    您的XAML基本相同,只是引用了正确的控件并添加了适当的命名空间(我的案例xmlns:myControls=“clr namespace:”)。

    <UserControl.Resources>
    
            <HierarchicalDataTemplate x:Key="MenuItemTemplate" ItemsSource="{Binding XPath=foo}">
                <AccessText Text="{Binding XPath=@a}" />
            </HierarchicalDataTemplate>
    
            <Style TargetType="{x:Type myControls:MyHierarchicalViewItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type myControls:MyHierarchicalViewItem}">
                            <StackPanel>
                                <ContentPresenter ContentSource="Header"/>
                                <ItemsPresenter Margin="10,0,0,0" />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
            <XmlDataProvider x:Key="RootXml" XPath="/root/foo">
                <x:XData>
                    <root xmlns="">
                        <foo a="one">
                            <foo a="two" b="wow, two" />
                            <foo a="three" b="wow, three" />
                            <foo a="four" b="wow, four" />
                        </foo>
                        <foo a="one again">
                            <foo a="two others" b="wow, two others" />
                            <foo a="three the hard way" b="wow, three again" />
                        </foo>
                    </root>
                </x:XData>
            </XmlDataProvider>
    
            </UserControl.Resources>
    
        <StackPanel>
            <myControls:MyHierarchicalViewItem
            Header="My Foo List"
            ItemTemplate="{Binding Source={StaticResource MenuItemTemplate}}"
            ItemsSource="{Binding Source={StaticResource RootXml}}">
            </myControls:MyHierarchicalViewItem>
        </StackPanel>
    
    </UserControl>
    
        2
  •  0
  •   rasx    16 年前

    这似乎是交易:

    <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Page.Resources>
    
        <XmlDataProvider x:Key="RootXml" XPath="/root/foo">
            <x:XData>
                <root xmlns="">
                    <foo a="one" b="test1">
                        <foo a="two" b="wow, two" />
                        <foo a="three" b="wow, three" />
                        <foo a="four" b="wow, four" />
                    </foo>
                    <foo a="one again" b="test2">
                        <foo a="two others" b="wow, two others" />
                        <foo a="three the hard way" b="wow, three again" />
                    </foo>
                </root>
            </x:XData>
        </XmlDataProvider>
    
        <Style TargetType="HeaderedItemsControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
                        <StackPanel>
                            <ContentPresenter ContentSource="Header"/>
                            <ItemsPresenter Margin="10,0,0,0" />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <HierarchicalDataTemplate x:Key="NestedFooItemTemplate">
            <AccessText Text="{Binding XPath=@b}" />
        </HierarchicalDataTemplate>
    
        <HierarchicalDataTemplate x:Key="FooItemTemplate">
            <StackPanel>
                <AccessText Text="{Binding XPath=@a}" />
                <HeaderedItemsControl
                    Header="My Nest"
                    ItemTemplate="{Binding Source={StaticResource NestedFooItemTemplate}}"
                    ItemsSource="{Binding XPath=./foo}"
                    Margin="10,0,0,0" />
            </StackPanel>
        </HierarchicalDataTemplate>
    
    </Page.Resources>
    
    <StackPanel>
        <HeaderedItemsControl
            Header="My Foo List"
            ItemTemplate="{Binding Source={StaticResource FooItemTemplate}}"
            ItemsSource="{Binding Source={StaticResource RootXml}}">
        </HeaderedItemsControl>
    </StackPanel>
    </Page>
    
        3
  •  0
  •   Aviad P.    16 年前

    HierarchicalDataTemplate 用于具有自动子元素展开的树视图。在您的情况下,您可以简单地使用普通 DataTemplate .

    推荐文章