您的位置:首页 > 其它

[Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)

2012-02-16 17:45 851 查看
 http://www.cnblogs.com/Mainz/archive/2011/05/24/2055465.html

 

用了一下Silverlight4的TreeView控件,发现其绑定(binding)很鸡肋,而且不能和MVVM模式很好的融合,微软还是基于控件的事件设计而不是基于MVVM模式设计。总之,Silverlight的绑定非常鸡肋,至少Silverlight4是如此,不知道5会不会改进。而且网上的TreeView无限极加载子项的例子都不是MVVM绑定的,都是在xaml.cs里面TreeViewItem加个Expanded事件;要么就不是MVVM,要么就不是异步动态加载,总之网上的例子没一个能用的。其实,我就是想实现TreeView的节点异步动态加载,就是当我们点击节点的加号的时候,即节点的Expanded事件处理中异步调用WCF
Ria Service,取得当前Expanded节点的子节点;同时,在异步调用过程中显示一个正在loading的子节点,异步调用完成的时候回调在界面显示。我想这是一个很普通的需求,从性能上考虑这样的异步动态加载才可以加载无限极的子节点。

捣腾了半天发现,在 Silverlight4里面,TreeView没有Expanded事件,节点TreeViewItem才有Expanded事件,而且不能用MVVM 模式很好的实现绑定,异步加载回调也没有。而且节点的IsExpanded属性在style中绑定也不支持,只能写死一个值True/False,喷血了(style中Binding只有在Silverlight5中才会支持)。

微软真的很鸡肋,看看人家Telerik的TreeView控件,就解决了Silverlight4的这个鸡肋问题,实现了异步动态加载数据的支持,看看这个:



好,咱没有Telerik就自己搞定!继续捣腾,参考老外的这篇文章,终于搞定了这个问题,完美实现了下面功能:

真正MVVM模式的TreeView实现
动态加载子节点(Load on demand)
异步加载子节点(调用WCF Ria Service)
每个节点都显示+号,点击+号展开,显示一个正在Loading...的子节点,同时通过WCF Ria Service动态异步加载子节点
我使用Prism
主要是扩展了TreeView和TreeViewItem,扩展了Behavior,并且用MVVM模式。这是代码结构:(CustomTreeView就是对TreeView和TreeViewItem的扩展,扩展了两个Behavior用来绑定Command)



最后在XAML里面这样配置,非常简洁:(里面是cv是引用的命名空间,xmlns:cv="clr-namespace:you.me.xxx",如果这个控件不在一个project里面,还要加assembly,像这样:xmlns:cv="clr-namespace:you.me.xxx;assembly=yourassemply"



而在Xaml.cs里面根本没有多余的代码,没有什么TreeViewItem加个Expanded事件等等,全都实现了绑定,全都在ViewModel层实现了。



我的后台WCF Ria Service的DomainService如下:



因为我们实现ItemExpanded Behavior,所以我们可以在ViewModel中添加ItemExpandedCommand的事件处理,就是异步调用WCF Ria Service,根据当前节点的ID找到它的子节点集合并异步返回,代码如下:



为什么每次点击节点前面的+号异步加载的过程中就会显示loading的子节点呢?其实很简单,就是每次加载的时候预先加载一个假的子节点,内容就是loading。这样这个节点就会有一个+号,用户点击展开的时候,自然会呈现loading这个子节点,同时去异步调用WCF Ria Service,当异步返回的时候,加载结果。就这么简单。根本不需要像有些人说的那样用ExpressionBlend画一个假的+号。



顺便说一下,我们的例子中显示的OrgTree表的结构,是一个树形结构。用ParentID表示父子关系,如果ParentID是空就是根节点。



本示例的运行环境:Silverlight4, Prism4, VS2010, WCF Ria Service. 如果有同学需要下载完整源代码的可以回复我的博文(http://www.cnblogs.com/Mainz/archive/2011/05/24/2055465.html)留下email,谢谢。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐