c# - 将任何 XML 文档绑定(bind)到 WPF TreeView

标签 c# wpf xml treeview typeconverter

我想使用 TypeConverter 将任何 XML 文档绑定(bind)到 WPF TreeView。

我最初的解决方案是使用递归,但是当文档很大时,UI 会被严重束缚。

以下链接讨论 TypeConverter 但针对特定节点/元素组合: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340

如果不知道 XML 文档是什么样子怎么办?由于这仅用于显示目的,我不太关心此时的功能,我只想将 XML 绑定(bind)到 TreeView。

最佳答案

它适用于其他节点类型,只需进行一些简单的修改。首先,必须将 HierarchicalDataTemplate.ItemsSource Binding XPath 更改为“child::node()|attribute::*”以允许任何子节点和任何属性。然后,为其他 NodeType 添加 DataTriggers。下面的例子对我有用。请注意,我为各种 NodeType 添加了图标,您可能想要删除它们:

        <HierarchicalDataTemplate x:Key="NodeTemplate">
        <StackPanel Orientation="Horizontal">
        <Image x:Name="icon" VerticalAlignment="Center" Margin="1,1,4,1"/>
        <TextBlock x:Name="name" Text="" />
        <TextBlock x:Name="inter" Text="" />
        <TextBlock x:Name="value" Text="" />
        </StackPanel>
        <HierarchicalDataTemplate.ItemsSource>
            <Binding XPath="child::node()|attribute::*" />
        </HierarchicalDataTemplate.ItemsSource>
        <HierarchicalDataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                <Setter TargetName="icon" Property="Source" Value="icons/element.png"></Setter>
                <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
                <Setter TargetName="icon" Property="Source" Value="icons/text.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Attribute">
                <Setter TargetName="icon" Property="Source" Value="icons/attribute.png"></Setter>
                <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter>
                <Setter TargetName="inter" Property="Text" Value=": "></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="CDATA">
                <Setter TargetName="icon" Property="Source" Value="icons/cdata.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="Comment">
                <Setter TargetName="icon" Property="Source" Value="icons/comment.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=NodeType}" Value="ProcessingInstruction">
                <Setter TargetName="icon" Property="Source" Value="icons/pi.png"></Setter>
                <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter>
            </DataTrigger>
        </HierarchicalDataTemplate.Triggers>
    </HierarchicalDataTemplate>

关于c# - 将任何 XML 文档绑定(bind)到 WPF TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/834632/

相关文章:

c# - 针对无效字符验证电子邮件地址

c# - 即使不使用 RedirectStandardError/RedirectStandardOutput,Process.WaitForExit 也会挂起

c# - 以 ViewModel 作为属性的 Wpf 数据绑定(bind)

xml - 首选项中缺少 Eclipse XSL 选项

xml - XML Schema 中的枚举定义是多余的

c# - 获取 Enum[] 的 int 值

c# - 在 Rotativa 生成的 PDF 中显示页眉和页脚

WPF:选项卡控件和数据模板

c# - XAML- 如何将图像添加到 <TabControl> 标记

mysql - 带有错误编码字符的大型 MYSQL 转储