在VB.NET中使用ListView和DataGrid嵌入控件

VB.NET中编程时,经常需要在ListView和DataGrid控件中嵌入各种控件。本文将展示如何在不使用XAML的情况下,通过代码实现这一功能。将通过一个示例程序来演示如何嵌入TextBlock、TextBox、FlowDocument和RichTextBox等控件。

在开发一个需要在网格中显示富文本的项目时,对于WPFDataGrid控件的资料感到非常沮丧。想通过代码(VB.NET,不使用XAML)来构建这个控件。但是,这方面的示例非常少。因此,决定创建一个大型示例程序,展示多种LINQ查询、控件和数据绑定的组合。

使用代码

附带的程序使用了三种不同的方法来捕获LINQ查询。该查询使用GetProcess方法获取当前正在运行的进程信息。

程序捕获了查询结果到一个匿名类型。

捕获了查询结果作为一个类的实例(ProcessInfo)。

使用上述方法创建了一个集合类(ProcessInfoCollection),该类使用INotifyPropertyChange来启用动态绑定。

用户可以选择任意或所有上述LINQ查询方法来创建绑定。绑定可以直接用于ListView或DataGrid控件,也可以间接通过创建DataTable来绑定DataTable。程序允许用户创建九种数据类型的DataTable。

DataTable列的类型继承自数据源。

所有列都是String类型。

所有列都是TextBlock控件。TextBlock具有一些富文本能力。由于TextBlock不能使用FrameworkElementFactory创建(它们缺少InlinesProperty),程序包含一个BindableTextBlock类,允许FrameworkElementFactory工作。

所有列都是BindableTextBlock。

所有列都是TextBox。TextBox缺乏富文本能力。

所有列都是FlowDocument的字符串表示。

所有列都是FlowDocument控件。

所有列都是RichTextBox控件。由于RichTextBox不能使用FrameworkElementFactory创建(它们缺少DocumentProperty),程序包含一个BindableRichTextBox类,允许FrameworkElementFactory工作。

所有列都是BindableRichTextBox。

用户可以选择ListView或DataGrid控件的列的数据类型。本质上,上述相同的选择。这意味着上述任何数据类型可能需要转换为任何其他数据类型(例如,TextBlock转换为RichTextBox)。所有这些组合都由IValueConverter接口的Convert方法处理。

为了演示如何样式化单个单元格,用户可以根据单元格的内容选择文本样式(使用正则表达式)。例如,所有以字母b开头的进程名称都加粗,以字母i开头的名称都斜体,以字母r开头的名称都有红色前景,以字母u开头的进程都下划线。否则,所有单元格都给予黑色前景和浅灰色背景在FrameworkElementFactory代码中。

刷新按钮将导致新数据出现在网格中,但仅适用于直接输入到ListView或DataGrid的INotify类(不是通过DataTable)。

最后一个选项允许用户生成ListView和/或DataGrid的窗口。要小心,很容易沉迷于选项,从而生成数十个窗口,这将耗尽计算机的CPU和内存。

要构建项目,只需创建一个新的VS 2010 WPF应用程序项目,然后粘贴/复制Window1.xaml.vb和Window1.xaml。无需添加引用。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485