WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)

原文 http://www.cnblogs.com/mgen/archive/2011/06/19/2084553.html

示例程序:

如上程序截图,一目了然典型的主从模式绑定应用,如果里面的数据不是用XML来存储而是已经初始化好的C#对象(比如国家是Country类的对 象,名字是Name属性,Provinces属性保存一个Province集合,代表国家的省/州,Province类包含Name属性代表名 称,Cities属性代表一些列City类对象……)那么主从模式绑定可以很简单的这样写:

1. 设置最外层DataContext为一系列的“国家”(“国家”集合)

2. 国家ListBox直接绑定

3. 省/州ListBox的ItemsSource为: {Binding Path=Provinces} (或者/Provinces)

4. 城市ListBox的ItemsSource为: {Binding Path=Province/Cities}

(注意所有ListBox的IsSynchronizedWithCurrentItem都设置成True)

但是如果放在Xml数据上,由于绑定上要用到XPath属性而不是Path属性,因此上述传统方案不适用,解决方案就是通过直接绑定所属 ListBox的SelectedItem值,然后再在这个值上进行XPath查询。注意第二层绑定直接用XPath,没有绑定最外层ListBox的 SelectedItem。ListBox代码如下:

<HeaderedContentControl>

<ListBox ItemsSource="{Binding}"

DisplayMemberPath="@name"

IsSynchronizedWithCurrentItem="True"/>

</HeaderedContentControl>

<HeaderedContentControl Header="省/州"

Grid.Column="1">

<ListBox Name="lbxProvince"

ItemsSource="{Binding XPath=province}"

DisplayMemberPath="@name"

IsSynchronizedWithCurrentItem="True"/>

</HeaderedContentControl>

<HeaderedContentControl Header="城市"

Grid.Column="2">

<ListBox DataContext="{Binding ElementName=lbxProvince, Path=SelectedItem}"

ItemsSource="{Binding XPath=city}"

IsSynchronizedWithCurrentItem="True"/>

</HeaderedContentControl>

完整的XAML代码

<Window.Resources>

<XmlDataProvider x:Key="xml" XPath="/countries/country">

<!-- 示例数据 -->

<x:XData>

<countries xmlns="">

<country name="中国">

<province name="陕西">

<city>西安</city>

<city>宝鸡</city>

</province>

<province name="山西">

<city>太原</city>

<city>大同</city>

</province>

<province name="内蒙古自治区">

<city>呼和浩特</city>

<city>包头</city>

<city>集宁</city>

</province>

<province name="河北">

<city>石家庄</city>

<city>保定</city>

</province>

</country>

<country name="美国">

<province name="加利福尼亚">

<city>洛杉矶</city>

<city>圣迭戈</city>

</province>

<province name="福罗里达">

<city>杰克逊维尔</city>

<city>迈阿密</city>

</province>

</country>

</countries>

</x:XData>

</XmlDataProvider>

<Style TargetType="HeaderedContentControl">

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="HeaderedContentControl">

<DockPanel>

<Border DockPanel.Dock="Top"

Margin="3"

CornerRadius="3"

Background="DarkRed">

<TextBlock Text="{TemplateBinding Header}"

HorizontalAlignment="Center"

Foreground="White"></TextBlock>

</Border>

<ContentPresenter ContentSource="Content"

ContentTemplate="{TemplateBinding ContentTemplate}"></ContentPresenter>

</DockPanel>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

<Style TargetType="ListBoxItem">

<Setter Property="SnapsToDevicePixels" Value="true"/>

<Setter Property="OverridesDefaultStyle" Value="true"/>

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="ListBoxItem">

<Border Name="Border"

Padding="2"

SnapsToDevicePixels="true">

<ContentPresenter />

</Border>

<ControlTemplate.Triggers>

<Trigger Property="IsSelected" Value="true">

<Setter TargetName="Border" Property="Background" Value="YellowGreen"/>

</Trigger>

</ControlTemplate.Triggers>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource xml}}">

<Grid.ColumnDefinitions>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

<ColumnDefinition></ColumnDefinition>

</Grid.ColumnDefinitions>

<HeaderedContentControl Header="国家">

<ListBox ItemsSource="{Binding}"

DisplayMemberPath="@name"

IsSynchronizedWithCurrentItem="True"></ListBox>

</HeaderedContentControl>

<HeaderedContentControl Header="省/州"

Grid.Column="1">

<ListBox Name="lbxProvince"

ItemsSource="{Binding XPath=province}"

DisplayMemberPath="@name"

IsSynchronizedWithCurrentItem="True"></ListBox>

</HeaderedContentControl>

<HeaderedContentControl Header="城市"

Grid.Column="2">

<ListBox DataContext="{Binding ElementName=lbxProvince, Path=SelectedItem}"

ItemsSource="{Binding XPath=city}"

IsSynchronizedWithCurrentItem="True"></ListBox>

</HeaderedContentControl>

</Grid>

作者:Mgen
出处:www.cnblogs.com/mgen
其他参考页面:我的软件和工程,博客导读。

posted on 2013-10-15 13:37 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3370095.html

WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)相关推荐

  1. WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!

    原文:WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference! 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可 ...

  2. WPF中如何将ListViewItem双击事件绑定到Command

    原文:WPF中如何将ListViewItem双击事件绑定到Command 今天的博客将介绍如何实现ListViewItem双击事件绑定到ViewModel中的Command.实现方法借助了Style中 ...

  3. html怎么给没张图片添加单击事件,如何在Canvas上的图形/图像绑定事件监听的实现...

    HTML中只能为元素/标签绑定监听函数: Canvas绘图中只有一个元素-canvas,每一个图形/图像都不是元素,不能直接进行事件绑定. 解决办法:"事件委托"--让canvas ...

  4. 使用控件设计窗体 上 布局主窗体 添加标签与文本框控件

    使用控件设计窗体 上 布局主窗体 添加标签与文本框控件 项目目标 所需控件 窗体基本设置 新建窗体 设置背景图片 设置平铺模式 设置icon 设置文字 修改名称 直接修改类名 标签控件与文本框控件 标 ...

  5. 如何实现绑定进程到指定核上?如何实现绑定某个中断到指定核上?

    如何实现绑定进程到指定核上?如何实现绑定某个中断到指定核上? 待完善. 转载于:https://www.cnblogs.com/zhouhaibing/p/7668788.html

  6. 码云线上误删主项目文件夹的恢复

    码云线上误删主项目文件夹的恢复 前言描述 解决办法 解决问题 前言描述 本来某个项目即将上线,然后同事不知道怎么的,直接打开了自己的码云,在网站上把主项目目录删除了....是的,删除了!!!! 收到消 ...

  7. WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了

    如果你写了一个 MarkupExtension 在 XAML 当中使用,你会发现你在 MarkupExtension 中定时的属性是无法使用 XAML 绑定的,因为 MarkupExtension 不 ...

  8. android 主屏幕,从Android上的主屏幕快速切换设置 | MOS86

    Android设备上的主屏幕是您可以在解锁屏幕时立即为各种应用,小部件,文件夹以及其他所有权限设置快捷方式.它可以让您跳转到设备上的几乎所有功能,包括网络浏览器,计算器,电子邮件应用等. 虽然它具有您 ...

  9. Spark HA高可用部署、基于文件系统单点恢复、基于zookeeper的Standby Master、如何恢复到上一次活着master挂掉之前的状态 03

    1. Spark HA高可用部署 Spark Standalone集群时Master-Slaves架构的集群模式,和大部分的Master-Slaves结果集群一样,存在着Master单点故障的问题.如 ...

最新文章

  1. 美酒换咖啡用java编写_Java 配 Shell 等于美酒加咖啡
  2. Python Django 通过admin后台创建表数据
  3. 取消挂载点可以节省磁盘么_Linux下NTFS格式外接硬盘的挂载,取消挂载和开机自动挂载...
  4. 判断客户端是电脑还是手机
  5. 【SHARE】WEB前端学习资料
  6. java集群调度_集群环境下定时调度的解决方案之Quartz集群
  7. java排序链表冒泡排序_Java中的冒泡排序
  8. 我的MVVM框架 v3教程——todos例子
  9. java和javascript双引号嵌套的问题
  10. python钻石图_Python笔记:制作各种水球图
  11. 创建用户, 使用crontab定时运行程序
  12. springBoot整合tkMybatis
  13. Maya---之viewcube的寻找
  14. python核心技术与实战,Python核心技术与实战——十五|深入了解迭代器和生成器...
  15. python的display显示_Python display.display方法代码示例
  16. 爬取校花图片保存到本地文件夹下(requests+re)
  17. lv双肩包尺寸对照表_当红Monogram帆布LV双肩包尺寸究竟有多少?
  18. 一文带你了解c++使用endl和使用‘\n‘的区别
  19. 2021-09-15如何把一个字符串的大小写取反(大写变小写小写变大写),例如 ’AbC‘ 变成 ‘aBc‘
  20. Unity3D——第一人称FPS生存游戏(resident zombies)

热门文章

  1. java语言中 负责并发编程的机制是_Java并发编程艺术-并发机制的底层原理实现...
  2. Ubuntu的默认root密码是多少,修改root密码
  3. python幂运算的符号有哪些及画法_SymPy 符号计算基本教程
  4. 【NOIP2001】【Luogu1025】数的划分(可行性剪枝,上下界剪枝)
  5. 832计算机专业基础,2019年考试科目832计算机组成原理与数据结构.doc
  6. 存储过程循环遍历一个月的每一天的函数_3.3 循环
  7. JavaScript基础和Web APIs两个阶段的关联性(1)
  8. java模拟多个用户操作,JAVA 模拟多用户提交动作
  9. 九大背包问题专题--混合背包问题(状态转移)
  10. C#基础4:函数+ref和out参数