Silverlight DataGrid中增加AutoCompleteBox列

来源:互联网 发布:人力资源优化配置 编辑:程序博客网 时间:2024/05/16 14:07

本文介绍为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的数据源的。