具有null值的绑定,在数据类中,可通过简单的值类型使用可控数据类型来反应数据库中可空的字段。如果是引用类型,可以直接使用,具有null值。绑定null值的结果是可以预测的:对于数字字段,这一行为能够区分缺少数据和零值的情况。可以通过绑定表达式中设置TargetNullValue属性类改变WPF对null值的处理方式。
绑定到对象集合绑定到单个对象是非常直观的。但是当需要绑定的对象是某些集合时,就需要使用更高级的元素。所有派生自ItemsControl的类都能够显示条目的完整列表。为了支持集合绑定,ItemsControl类定义了3个重要的属性:
名称 说明ItemsSource 指向的集合包含将在列表中显示的所有对象
DisplayMemberPath 确定用于为每个项创建显示文本的属性
ItemTemplate 接受的数据模板用于每个项创建可视化外观。这个属性比DispalyMemberPath属性强大的多
只要是支持IEnumerable接口(数组、各种类型的集合以及许多特殊的封装了数据项组的对象都支持该接口),都可以用来填充ItemsSource属性。然而,基本的IEnumerable接口仅支持只读绑定。
提高大列表性能虚拟化
WPF列表控件提供的最重要的功能是UI虚拟化(仅为当前显示项创建容器对象的一种技术)。例如一个具有5000条记录的ListBox控件,但是可见区域只能包含10条记录,ListBox只创建10个ListBoxItem对象,而不是全部记录都创建。
UI虚拟化支持实际上没有被构建进ListBox或者ItemsControl类,而是被硬编码到VirtualizingStackPanel容器,除了支持虚拟化外,该面板和StackPanel面板的功能类似。ListBox、ListView以及DataGrid是自动使用虚拟化面板来布局其子元素,Commbox使用标准的没有虚拟化的StackPanel面板,如果要支持虚拟化,就要明确地通过提供新的ItemsPanelTemplate来添加虚拟化支持。
<ComboBox HorizontalAlignment="Left" VerticalAlignment="Top"> <ComboBox.ItemTemplate> <ItemContainerTemplate> <VirtualizingStackPanel/> </ItemContainerTemplate> </ComboBox.ItemTemplate> </ComboBox>TreeView是另一个支持虚拟化的控件,但在默认情况下,她关闭了改功能。可以通过属性来启用特性。
<TreeView VirtualizingPanel.IsVirtualizing="True"/>一般情况下,对列表控件进行绑定数据时,不会将很多的数据绑定到列表控件,会使用分页等操作进行少数数据的展示。
项容器再循环
通常当滚动支持虚拟化时,控件不断地创建新的项容器对象以保持新的可见项,如果启用了项容器再循环,ListBox控件将只保持少量ListBoxItem对象存活,当滚动时,通过新数据加载这些ListboxItem对象,从而重复使用他们。提高了滚动性能,降低了内存消耗。除DataGrid之外的所有控件,该特性默认是禁用的。
VirtualizingPanel.VirtualizationMode="Recycling"
缓存长度
VirtualizingStackPanel创建了几个超过其显示范围的附加项。这样,在开始滚动时,就可以立即显示这些项。可以使用CacheLength和CacheLengthUnit来选择如何指定附加项的数量。
VirtualizingPanel.CacheLength="10" VirtualizingPanel.CacheLengthUnit="Item"