【技术原创】如何在SilverLight/WPF中给DataGrid动态组织模板内容
最近在使用SilverLight开发项目,感觉它很适合做企业后台管理软件开发。因为之前只用过WPF,对SilverLight这个子集了解得不是很多。于是我在之前的Asp.Net下写过的一个快速开发框架,就得在SiverLight中重新实现。这期间遇到不少问题,还好都一一解决了。其中我想跟大家分享一下今天中午我遇到的这个问题:如何在SilverLight中给DataGrid动态组织模板内容。
先说应用场景:
在需要以列表形式展示数据的界面中,放入一个DataGrid(实际上是我重写过的),再放一个分页控件,设置一下,即可实现自动绑定数据并分页。为了追求代码的简洁与框架的完美,我又添加了一个功能,就是将界面中功能按钮的添加放到分页控件里,这样无论前端界面还是后台代码,都可以变得很简洁。于是乎,在DataGrid中动态组织模板内容就成了一个技术难题。
首先,我尝试了一下用代码生成DataGridTemplateColumn模板列,但到CellTemplate这一步后就无法再进行下去了,因为DataTemplate对象无法操作其内部元素。在网上找了一些解决方法,无外乎这三种方案:
方案一:动态组织Xaml字符串,转成DataTemplate
先将要生成的模板内容用Xaml字符串拼起来,然后再使用XamlReader加载,转化成DataTemplate添加到模板列中;方案二:Xaml文件加载在资源中,转成DataTemplate
事先将Xaml文件写在资源中,使用时直接加载转化成DataTemplate;方案三:使用第三方控件
总结这三种方案,也只有方案一,即动态组合Xaml字符串的能凑合满足我的需求(因为我还涉及到模板里面的控件处理,事件触发等,使用此方案麻烦就大了),而且拼那字符串实在是比较蹩脚。于是我觉得肯定有方案能解决这个问题(毕竟我都能找到DataTemplate对象,只是不能访问内部元素而已)。忽然想到之前我写终端展示框架时用的一个技巧,我想这里可以借来用一下:总结成四个字就是:借鸡下蛋。
在别处:WPF中如何设置自定义控件不在工具箱中显示
今天在项目开发中,遇到了一个问题,就是使用VS2010时,WPF中的UserControl如何设置为不在工具箱中显示。之前在开发WinForm时我们知道可以使用[ToolboxItem(false)]属性标记一下即可以。但在WPF里就不一样了,咱在网上了找一阵子,中文里是没有的,最终咱还是找到解决方案了,就是:
标记:[System.ComponentModel.DesignTimeVisible(false)]。
真不明白,为什么WPF里又要搞一套呢,而且Microsoft.Windows.Desgin里也有一个设置在工具箱中隐藏的,结果不起作用。
希望对开发WPF控件的人有所帮助。