热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF中的主从(MasterDetail)实现

下面这个例子本身来自微软官网,由于没有找到官网源码,我在这里自己实现了一下。还是向官网致敬。什么是Master-Detail?直接上个图给

    下面这个例子本身来自微软官网,由于没有找到官网源码,我在这里自己实现了一下。还是向官网致敬。

    什么是Master-Detail?直接上个图给大家看,就知道了:


    这看起来真复杂,点中ListBox里出现的人名,下面要出现这个人的具体信息:姓、名、籍贯。这种应用场景还真不少。如果能够掌握岂不是爽,客官不急,下面听我慢慢道来。

    类似像上面这样子在某个列表中选中一项信息概要,旁边某处就能够显示选中元素相应的详细信息的,微软就称之为Master-Detail应用。

    好了,像上面这个例子怎么实现呢?我们一步一步来,首先我们想到的肯定是要实现一个Person类,这个类包含姓、名、籍贯。这个类的代码相信大部分人都会写,如下所示:

public class Person{public string FirstName { get; set; }public string LastName { get; set; }public string HomeTown { get; set; }public Person(string f, string l,string h){FirstName = f;LastName = l;HomeTown = h;}public override string ToString(){return FirstName;}}

    看,这个类里面看不到一丁点与界面交互的意思,全是赤裸裸的纯C#代码。不过,这里隐隐的有个ToString()需要稍微解释下:

    Person类实现了ToString()方法,这样子ListBox绑定包含Person的集合后,不显示设置DisplayMemberPath,那么就会默认调用Person的ToString()来显示每个项的内容到ListBox控件当中。

    下面是定义People类,这个类是Person的集合:

public class People : ObservableCollection{public People(){Add(new Person("Yun", "Ma", "HangZhou"));Add(new Person("Qiangdong", "Liu", "NanJing"));Add(new Person("Yanhong", "Li", "BeiJing"));}}

    很清晰,上面代码所示,添加了三个人的信息。注意没有一丁点和界面交互的意思。

    上面的两段代码添加到你的MainWindows类所在的c#源文件当中。

    XMAL中的代码如下所示:

My Friends:Information:

    如上所示,软件界面的ListBox和ContentControl两个最主要的控件都绑定到了MyFriends这个key所代表的资源当中。ListBox的绑定如下:

ItemsSource="{Binding Source={StaticResource MyFriends}}"

    这个很好理解,表示绑定到了Person集合People中,这样子ListBox的每个项就会显示集合中的每个内容,因为ListBox中省却了DisplayMemberPath属性的设置,所以显示的具体内容是由集合中的每个项(也就是Person)的ToString()方法的返回值来决定的。

    ContentControl控件的绑定如下所示:

Content="{Binding Source={StaticResource MyFriends}}"

    可能觉得比较奇怪,为什么明明是内容(Content)控件,为何要绑定到一个集合当中呢?这里解释给大家,WPF在这个地方比较智能,它内部框架默认是绑定到这个绑定集合所指向的当前项(CurrentItem)。

    那好了,新的问题来了,ListBox当中选中集合中的某一项,怎么让ContentCotrol控件中显示相应选中项的详细信息呢? 大家可能想到的一种办法是自己在C#后台写一堆操作代码:ListBox选中事件SelectionChanged中添加相应的事件来改变ContentControl控件的具体内容。这是一个思路,不过要指出的是WPF其实在这点上已经帮我们前期做好了框架工作了。你只要在XMAL文件的ListBox控件当中添加

IsSynchronizedWithCurrentItem="True"

    一切就搞定了,你不需要再额外添加代码,WPF就是这么任性,你在后台几乎都没有加任何和界面操作相关的哪怕一句代码,神奇所在,界面与逻辑完全隔离!!!跟界面相关的交互代码几乎全部在XMAL中搞定。

    好,那么我们就介绍下IsSynchronizeWithCurrentItem是怎么工作的?那你可就可以参考我的另外一篇博文:

点击打开链接



推荐阅读
author-avatar
lantshirt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有