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

简介: 原文 http://www.cnblogs.com/mgen/archive/2011/06/19/2084553.html 示例程序:   如上程序截图,一目了然典型的主从模式绑定应用,如果里面的数据不是用XML来存储而是已经初始化好的C#对象(比如国家是Country类的对 象,名...

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

示例程序:

image

 

如上程序截图,一目了然典型的主从模式绑定应用,如果里面的数据不是用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—多重绑定和跨层级绑定
WPF—多重绑定和跨层级绑定
|
9月前
|
存储 自然语言处理 C#
WPF技术之Binding
WPF(Windows Presentation Foundation)是微软推出的一种用于创建应用程序用户界面的框架。Binding(绑定)是WPF中的一个重要概念,它用于在界面元素和数据源之间建立关联。通过Binding,可以将界面元素(如文本框、标签、列表等)与数据源(如对象、集合、属性等)进行绑定,从而实现数据的双向传递和同步更新。
144 2
WPF技术之Binding
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8061 0
|
9月前
|
C#
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
86 0
|
10月前
|
C# 数据库
WPF中DataGrid控件绑定数据源
WPF中DataGrid控件绑定数据源
119 0
|
C#
WPF更新绑定字段
WPF更新绑定字段
73 0
|
前端开发 C#
WPF 之 数据与命令绑定 (MVVM方式)
WPF 之 数据与命令绑定 (MVVM方式)
160 0
WPF 之 数据与命令绑定 (MVVM方式)
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6848 0
|
C# Windows
WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配
原文:WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配 WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配 网上的例子都是零散的   翻阅了 很多篇文章后 再根据 自己项目的实际需求  整理出一个完整的 应用例子...
1060 0