gpt4 book ai didi

wpf - 带有 ControlTemplate 的 HierarchicalDataTemplate 和 HeaderedItemsControl 无法显示嵌套数据

转载 作者:行者123 更新时间:2023-12-04 07:01:26 25 4
gpt4 key购买 nike

我可以让这个模式与 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>

在 XamlPadX 中,这显示:
My foo list
one
one again

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

最佳答案

这是一个迟到的答案。也一直试图弄清楚这一点,但对上述答案和/或链接答案中的推理不满意,因为所有控件之间的 XAML 模式应该相同。

在使用 jetbrains dotPeek 一段时间后,结合 TreeView Control 的想法,答案终于很简单了。 TreeView 和 TreeViewItem 覆盖 IsItemItsOwnContainerOverride 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 或 Menu)将是这样的:
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>

关于wpf - 带有 ControlTemplate 的 HierarchicalDataTemplate 和 HeaderedItemsControl 无法显示嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1777867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com