本文介绍为silverlight DataGrid增加AutoCompleteBox列的两种方法,众所周知DataGrid有个模板列(DataGridTempleteColumn)列,其功能非常强大,在模板列中基本上什么组件都可以放,因此我们不难想到用模板列很容易就可以实现.下面展示模板列的方式的几个步骤:
1.在Resource中定义AutoCompleteBox的ItemTemplate,定义下拉列表中的每一项的显示方式及其内容.
2.定义AutoCompleteBox的数据源
2.定义DataGridTemplateColumn字段
3.如果需要,实现转换器类,实现IValueConverter接口,binding表达式中指定转换器
在上面例子中数据源的CurrencyID对应Currency的ID字段,用户输入时输入Currency的Name字段,因此需要ID和Name之间进行转换.
4.在Resouces中声明Converter
5.修改binding语句指定Converter及其Convert的参数等信息.
经过以上步骤基本完成了AutoCompleteBox列增加.
上述方法有以下问题:
1.步骤比较多
2.为每个使用到AutoCompleteBox列的地方都要以上处理,重复工作较多
3.为每个类似Key,Value的转换都要写个Converter类
那么我们能否写个类似DataGridTextColumn的DataGridAutoCompleteColumn类,通过简单的绑定就可以完成以上工作呢?答案肯定是可以的.
下面让我们来动手实现这个DataGridAutoCompleteColumn吧!
设计DataGridAutoCompleteColumn类面临几个问题:
1.为我们的DataGridAutoCompleteColumn选择一个合适的基类,并重写相应的方法
2.实现一个通用的转换器,完成Key,Value的映射
解决方法:
对于第一个问题我们选择DataGridBoundColumn类做为基类,重写GenerateElement,GenerateEditingElement,CancelCellEdit,PrepareCellForEdit等方法.
对于第二个问题我们指定ValueMemberPath,DisplayMemberPath,利用反射机制来实现这两个字段间的映射即可。下面是我实现的代码:
DataGridAutoCompleteColumn实现代码:
DataGridAutoCompleteColumnConverter类实现代码:
到此我们的DataGridAutoCompleteColumn类基本开发完成.
使用时我们只需要以下声明就可以:
当然在Resource里面还是要定义ItemsSource的数据源的。