Wpf HierarchycalDataTemplate和HeaderedItemsControl与ControlTemplate无法显示嵌套数据
我可以使此模式与Wpf HierarchycalDataTemplate和HeaderedItemsControl与ControlTemplate无法显示嵌套数据,wpf,xaml,hierarchicaldatatemplate,xmldataprovider,Wpf,Xaml,Hierarchicaldatatemplate,Xmldataprovider,我可以使此模式与菜单和树状视图配合使用,但在尝试使用HeaderedItemControl时,我肯定遗漏了一些内容: <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" > <P
菜单
和树状视图
配合使用,但在尝试使用HeaderedItemControl
时,我肯定遗漏了一些内容:
<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>
我是否需要使用
ControlTemplate
来正确显示数据?或者我需要更精细的(或附加的)hierarchycaldatatemplate
?另外:我们如何显示foo/@b
数据?这似乎就是交易:
<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>
HierarchycalDataTemplate
用于具有自动子元素扩展的树视图。在您的情况下,您只需使用一个普通的数据模板
以下是一个迟来的答案。我也一直在尝试解决这个问题,但对上述答案和/或链接答案中的推理不满意,因为所有控件之间的XAML模式应该是相同的
使用jetbrains dotPeek一段时间后,combing认为TreeView控件的答案最终相当简单。TreeView和TreeViewItem override是将自己的ContainerOverride和GetContainerForItemOverride转移到将容纳子项的控件(TreeView情况下的TreeViewItem)。您可以创建两个简单的自定义控件来处理此问题
您的HeaderedItemControl类如下:
public class MyHierarchicalViewItem : HeaderedItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MyHierarchicalViewItem;
}
protected override DependencyObject GetContainerForItemOverride()
{
return (DependencyObject)new MyHierarchicalViewItem();
}
}
您的ItemControl(相当于TreeView或菜单)如下所示:
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:”)
在这里找到了答案:
public class MyHierarchicalView:ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is MyHierarchicalViewItem;
}
protected override DependencyObject GetContainerForItemOverride()
{
return (DependencyObject) new MyHierarchicalViewItem();
}
}
<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>