原文 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

其他参考页面:我的软件和工程博客导读

WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)的更多相关文章

  1. 【转】在CentOS 8 / RHEL 8上配置主/从BIND DNS服务器

    转自: https://zh.codepre.com/centos-2700.html 前言 本指南描述了在CentOS 8 / RHEL 8 Linux上配置BIND DNS服务器所需的步骤.在Ce ...

  2. 转:WPF中ListBox的创建和多种绑定用法

    先从最容易的开始演示ListBox控件的创建. Adding ListBox Items下面的代码是向ListBox控件中添加多项ListBoxItem集合.XAML代码如下:<ListBox ...

  3. 整理:WPF中XmlDataProvider的用法总结

    原文:整理:WPF中XmlDataProvider的用法总结 一.目的:了解XmlDataProvider中绑定数据的方法 二.绑定方式主要有三种: 1.Xaml资源中内置: <!--XPath ...

  4. WPF使用MVVM(一)-属性绑定

    WPF使用MVVM(一)-属性绑定 简单介绍MVVM MVVM是Model(数据类型),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式,优点一劳永逸,初步增加一些逻 ...

  5. WPF使用MVVM(二)-命令绑定

    WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...

  6. WPF解决按钮上被透明控件遮盖时无法点击问题

    原文:WPF解决按钮上被透明控件遮盖时无法点击问题 IsHitTestVisible="False" 在控件上设置如上属性即可,即可让透明控件不触发点击效果

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

    原文:WPF 让普通 CLR 属性支持 XAML 绑定(非依赖属性),这样 MarkupExtension 中定义的属性也能使用绑定了 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4 ...

  8. 示例:WPF开发的简单ObjectProperyForm用来绑定实体表单

    原文:示例:WPF开发的简单ObjectProperyForm用来绑定实体表单 一.目的:自定义控件,用来直接绑定实体数据,简化开发周期 二.实现: 1.绑定实体对象 2.通过特性显示属性名称 3.通 ...

  9. 整理:WPF中应用附加事件制作可以绑定命令的其他事件

    原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...

随机推荐

  1. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

    xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...

  2. 让两个Div并排显示

    一.使用display的inline属性 <div style="width:300px; height:auto; float:left; display:inline"& ...

  3. [问题解决] Could not update ICEauthority file /home/username/.ICEauthority

    错误: Could not update ICEauthority file /home/username/.ICEauthority 发生场景: 虚拟机下的ubuntu server12.04 解决 ...

  4. (8) Xamarin使用Jar檔

    原文 Xamarin使用Jar檔 这个范例是如何在Xamarin.Android中去使用一个我们自行在开发的JAR档案. 主要会执行的步骤如下 在Xamarin建立一个Android Java Bin ...

  5. _.remove的用法

    var array = [1, 2, 3, 4]; var evens = _.remove(array, function(n) { return n % 2 == 0; }); console.l ...

  6. twisted的一些代码

    之前用swoole(1.7.19)写的一段程序在数据量大的时候存在内存泄漏,改为twisted(15.4)实现,自测无误,记录如下(两者cpu占用率90%时吞吐rps能从120提升到1000). #! ...

  7. NYOJ306 走迷宫(dfs+二分搜索)

    题目描写叙述 http://acm.nyist.net/JudgeOnline/problem.php?pid=306 Dr.Kong设计的机器人卡多非常爱玩.它经常偷偷跑出实验室,在某个游乐场玩之不 ...

  8. java--jsp+ssh+select动态结合数据和选择(解)

    在三层体系结构和jsp合并项目,如何实现select动态绑定数据和动态选择指定的行?让我们来看看下面的: 1.首先定义一个Bean分类.它用于实例select的结合数据中的每一个id和name: pu ...

  9. .Net 利用消息在进程间通讯实现进程互操作

    有时候我们会遇到需要在两个进程间通过某种方式实现互操作,方法有很多,例如你可以尝试让两个进程持续监视一个外部文件,由此文件记录各自进程的数据:还有可以使用网络端口实现进程间通讯.共享一片内存区域记录及 ...

  10. 用ssh建立机器之间的信任机制

    继续整理以前的博客,第二弹:用ssh建立机器之间的信任机制 #!/bin/bash #需要远程添加信任机制的机器 REMOTE[]=db-XXX-XXX1.db01 REMOTE[]=db-XXX-X ...