WPF_拖拽任意XML结构生成TreeView
2010-04-13 20:00
495 查看
使用 HierarchicalDataTemplate、DataTrigger、MultiBinding 和 Converter 。
数据源为拖拽的任意具有 XML 标准结构(如HTML、XAML和MXML)的文件或字符串文本。
通过 CheckBox 选择显示 XmlElement 的 Name 或 Attributes。
允许拖拽的数据对象中的数据存储格式应该为文本数据或文件放置格式,所以 PreviewDragOver 时判断:
根据不同数据格式处理数据:
最后别忘记:
接下来开始设计 TreeView 外观:
CheckBox 将处理 XmlElement 相关显示。
处理 NodeType 为 Element 比较复杂,需要多重绑定和
请点击下载示例(内含一个示例的XML文件)。
想想:
XML中不能出现任何中文字符,结构也必须正确,否则将无法生成 TreeView。
没有用延迟加载技术(XML文件直接在内存中),但点击打开节点才延迟加载显示内容。(调试 textConverter 可知)
若拖拽多个文件,只处理“第一个”。(见FirstOrDefault())(与点击的顺序无关,真怪异!)
本文只处理了常用的节点类型。如果要处理 XML 的其他 XmlNodeType 的节点类型(如 <!DOCTYPE...>,类型为 DocumentType),可以在 VS 中设断点调试,在“快速监视”窗口中查看获得的 Document(或 Element)的相关父子属性,然后再添加相应的 DataTrigger ,设置其 Value="......"。如果对象复杂可参照 MultiBinding 用转换返回所需要显示的数据。
欢迎意见或建议!
数据源为拖拽的任意具有 XML 标准结构(如HTML、XAML和MXML)的文件或字符串文本。
通过 CheckBox 选择显示 XmlElement 的 Name 或 Attributes。
示例
新建一 TreeView ,为了能拖拽及处理拖拽动作,需要在 TreeView 中添加代码:AllowDrop="True" PreviewDragOver="treeView_PreviewDragOver" PreviewDrop="treeView_PreviewDrop
允许拖拽的数据对象中的数据存储格式应该为文本数据或文件放置格式,所以 PreviewDragOver 时判断:
if (e.Data.GetDataPresent(DataFormats.Text, false) || e.Data.GetDataPresent(DataFormats.FileDrop, false))
并设置当前相应拖放效果的:
e.Effects = DragDropEffects.Copy; 或:
e.Effects = DragDropEffects.None;
因为在 XAML 中绑定 XML :
<XmlDataProvider x:Key="xmlDataProvider"> <x:XData>
同理, C# 参照着,以便绑定到合适的数据源格式:
XmlDataProvider xmlDataProvider = new XmlDataProvider();
根据不同数据格式处理数据:
if (e.Data.GetDataPresent(DataFormats.Text, false)) { string text = e.Data.GetData(DataFormats.Text, false).ToString(); XmlDocument xd = new XmlDocument(); xd.LoadXml(text); xmlDataProvider.Document = xd; } else if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) { string fileName = (e.Data.GetData(DataFormats.FileDrop, false) as string[]).FirstOrDefault(); xmlDataProvider.Source = new Uri(fileName); }
最后别忘记:
treeview.DataContext = xmlDataProvider; 注意,这相应于在 XAML 中设置 DataContext 属性,但 XAML 中仍然需要设置 ItemsSource 属性:
ItemsSource="{Binding}" <!--若没 ItemsSource="{Binding XPath=*}" 则原 XML 外少包一层,导致无法显示最外层的非 Element 节点-->
接下来开始设计 TreeView 外观:
<HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding}"> <!--ItemsSource="{Binding}"才能显示子节点数据--> <StackPanel Orientation="Horizontal"> <CheckBox x:Name="checkBox" Opacity="0"> </CheckBox> <TextBlock x:Name="text" Text="?" /> </StackPanel> </HierarchicalDataTemplate>
CheckBox 将处理 XmlElement 相关显示。
处理 NodeType 为 Element 比较复杂,需要多重绑定和
<HierarchicalDataTemplate.Triggers> <DataTrigger Binding="{Binding NodeType}" Value="Element"> <Setter TargetName="text" Property="Text"> <Setter.Value> <MultiBinding Converter="{StaticResource textConverter}"> <Binding></Binding> <Binding ElementName="checkBox" Path="IsChecked"></Binding> </MultiBinding > </Setter.Value> </Setter> <Setter TargetName="checkBox" Property="Opacity" Value="1"> </Setter> </DataTrigger> </HierarchicalDataTemplate.Triggers>
上面的<Binding></Binding>为了在转换中获取 Element:
XmlElement element = values[0] as XmlElement; 所以可以对 element 对象作处理,如属性:
foreach (XmlAttribute e in element.Attributes)
注意操作转换要在 XAML 中增加:
xmlns:local="clr-namespace:WPF_XML_AnyStyle" <local:TextConverter x:Key="textConverter"></local:TextConverter>
如果 checkBox 选中则只是:
return element.Name; 没选可以返回如属性等的值。(详见代码)
为了能显示其他类型的 XML 节点:
<DataTrigger Binding="{Binding NodeType}" Value="Element"> 这里的 ="Element" 可以换成如 "Comment" 等的 XmlNodeType 枚举类型。
请点击下载示例(内含一个示例的XML文件)。
想想:
XML中不能出现任何中文字符,结构也必须正确,否则将无法生成 TreeView。
没有用延迟加载技术(XML文件直接在内存中),但点击打开节点才延迟加载显示内容。(调试 textConverter 可知)
若拖拽多个文件,只处理“第一个”。(见FirstOrDefault())(与点击的顺序无关,真怪异!)
本文只处理了常用的节点类型。如果要处理 XML 的其他 XmlNodeType 的节点类型(如 <!DOCTYPE...>,类型为 DocumentType),可以在 VS 中设断点调试,在“快速监视”窗口中查看获得的 Document(或 Element)的相关父子属性,然后再添加相应的 DataTrigger ,设置其 Value="......"。如果对象复杂可参照 MultiBinding 用转换返回所需要显示的数据。
欢迎意见或建议!
相关文章推荐
- 绑定任意格式的XML文档到WPF的TreeView
- 绑定任意格式的XML文档到WPF的TreeView
- JS读取XML字符串生成树结构
- javascript解析XML生成树形结构
- 根据数据库结构生成TreeView
- JAVA-使用反射为任意对象生成XML
- WPF TreeView 绑定到层次结构数据库
- WPF自定义TreeView显示结构通用类
- 如何实现具有层次结构的 TreeView <四> (WPF/TreeView/Style/Template)
- C#实现树型结构TreeView节点拖拽的简单功能(转)
- WPF 实现按钮的任意拖拽
- SqlServer存储过程生成一个有树结构的xml文档
- [转]基于模板和XML在BS结构应用中生成word文件
- WPF—TreeView无限极绑定集合形成树结构
- WPF—TreeView无限极绑定集合形成树结构
- 分享 C#不用treeview控件生成漂亮的树型结构
- Java工具类_表结构自动生成对应的实体类、Mapper.xml文件、Dao类
- javascript解析XML生成树形结构
- Delphi 中用 Xml 配置文档生成 Treeview
- WPF中TreeView和Xml的结合使用案例