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>
WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)的更多相关文章
- 【转】在CentOS 8 / RHEL 8上配置主/从BIND DNS服务器
转自: https://zh.codepre.com/centos-2700.html 前言 本指南描述了在CentOS 8 / RHEL 8 Linux上配置BIND DNS服务器所需的步骤.在Ce ...
- 转:WPF中ListBox的创建和多种绑定用法
先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox ...
- 整理:WPF中XmlDataProvider的用法总结
原文:整理:WPF中XmlDataProvider的用法总结 一.目的:了解XmlDataProvider中绑定数据的方法 二.绑定方式主要有三种: 1.Xaml资源中内置: <!--XPath ...
- WPF使用MVVM(一)-属性绑定
WPF使用MVVM(一)-属性绑定 简单介绍MVVM MVVM是Model(数据类型),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式,优点一劳永逸,初步增加一些逻 ...
- WPF使用MVVM(二)-命令绑定
WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...
- WPF解决按钮上被透明控件遮盖时无法点击问题
原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果
- WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了
原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...
- 示例:WPF开发的简单ObjectProperyForm用来绑定实体表单
原文:示例:WPF开发的简单ObjectProperyForm用来绑定实体表单 一.目的:自定义控件,用来直接绑定实体数据,简化开发周期 二.实现: 1.绑定实体对象 2.通过特性显示属性名称 3.通 ...
- 整理:WPF中应用附加事件制作可以绑定命令的其他事件
原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...
随机推荐
- 第八章: IO库
一.IO类 1.iostream定义了读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型 2.不能拷贝IO对象,因此不能将形参或返回类型设置为 ...
- qrcode各版本/各类型容量支持表
1.qrcode共有40个版本,支持各种类型数据.个人一般统一转换成8位字节进行算法存储.(汉字 --uff8占用3个字节)
- php的cURL库介绍
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的 ...
- [剖析Javascript原理]1.原生数据类型
一.原生数据类型 JS共有5种原生数据类型: Boolean true或者false String 字符串,在单引号或者双引号之间(不存在字符类型) Number 整数或者浮点数 Null 空 und ...
- ajax调用后台Java
//html部分 <input type='text' placeholder='用户名' id="username" name="username" c ...
- MapReduce ---- TD-IDF
1.TF-IDF TF-IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明.描述单个term与特定document的相关 ...
- Microsoft Azure 在北美 TechEd 大会上发布令人振奋的更新,帮助客户开始使用云服务
云计算因其速度.规模和成本节省等优势而备受众多企业青睐.但企业需帮助,才能以安全可靠的方式使用云,同时还要利用企业的现有投资, 才能实现这些优势.因此,在TechEd 大会上,我们推出了一些新的服务, ...
- Windows Azure Web Role 的 IIS 重置
如果您是一名 Web开发人员,您很可能使用过"简单快捷"的iisreset命令重置运行不正常的 IIS主机.这种方法通常在经典的 Windows Server VM上非常有效 ...
- qemu 调试(二)
我见过最全的剖析QEMU原理的文章 qemu代码分析 qemu中ELF文件的加载 几个关键点,可以设计断点,观察. $ cat command.gdbset breakpoint pending on ...
- qt 5.1.1 on CentOS 6.4
Overview If you are trying to install Qt and Qwt [qwt.sourceforge.net] (Qt Widgets for Technical App ...