CacheLengthUnit允许选择如何指定附加项的数量:项数、页数(其中,单页包含适应于控件可视窗口的所有项)或者像素数(如果项显示不同大小的图片,这个选择更合理)
延迟滚动
为进一步提高滚动性能,可开启延迟滚动特性。当用户在滚动条上拖动滚动滑块时不会更新列表显示,只有用户释放滚定滑块时才刷新。
ScrollViewer.IsDeferredScrollingEnabled="True"
VirtualizingStackPanel通常使用基于项的滚动,这意味着当向下滚动少许时,下一项就显示出来。无法滚动查看项的一部分,在面板上至少会滚动一个完整项。可以通过属性覆盖该行为:
VirtualizingPanel.ScrollUnit="Pixel"
验证在任何数据绑定中,另一个要素是验证(捕获非法数值并拒绝这些非法数值的逻辑)。可直接在控件中构建验证(例如,通过响应文本框中的输入并拒绝非法字符),这种低级的方法限制了灵活性。验证提供了两种方法用于捕获非法值:
可在数据对象中引发错误。为告知WPF发生了错误,只需要从属性设置过程中抛出异常。通常,WPF会忽略所有在设置属性时抛出的异常,但可以进行配置,从而显示更有帮助的可视化指示。另一种选择是在自定义的数据类中实现INotifyDataErrorInfo或IDataErrorInfo接口,从而可得到指示错误的功能而不会抛出异常
可在绑定级别上定义验证。这种方法可获得使用相同验证的灵活性,而不必考虑使用的是哪个控件输入。更好的是,因为是在不同的类中定义验证,所以可很容易地在存储类似数据类型的多个绑定中重用验证。
只有当来自目标的值正被用于更新源时才会应用验证,也就是只有当使用TwoWay模式或者OneWayToSource模式时的绑定才应用验证。
在数据对象中进行验证
public class MainWindowViewModel : NotifyPropertyBase { private decimal? _productPrice; public decimal? ProductPrice { get => _productPrice; set { if (value.HasValue && value.Value < 0) { throw new Exception("ProductPrice 不能小于0"); } else { _productPrice = value; OnPropertyChanged("ProductPrice"); } } } }上面的示例中主要验证价格不能小于0,但是不能为用户提供任何与问题相关的反馈(WPF会忽略当设置和获取属性时发生的数据绑定错误),对于这种情况,用户无法知道更新已经被拒绝。实际上,非法的值依然保留在文本框中,只是没有被应用到绑定的数据对象。需要借助于ExceptionValidationRule验证规则。
ExceptionValidationRule验证规则
ExceptionValidationRule是预先构建的验证规则,它向WPF报告所有异常。要使用ExceptionValidationRule验证规则,必须将他绑定到Binding.ValidationRules集合中,如下代码:
<TextBox HorizontalAlignment="Left" VerticalAlignment="Top"> <TextBox.Text> <Binding Path="ProductPrice"> <Binding.ValidationRules> <ExceptionValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox>这个例子中,同时使用了值转换器和验证规则。通常是在转换值之前进行验证,但是ExceptionValidationRule比较特殊。它捕获在任何位置发生的异常,包括当编辑的值不能转换成正确数据类型时发生的异常、由属性设置器抛出的异常以及由值转换器抛出的异常。
当验证失败时,System.Windows.Controls.Validation类的附加属性记录下验证错误。对于每个失败的验证规则,WPF分一下3个步骤:
在绑定的元素上(TextBox控件),将Validation.HasError附加属性设置为true
创建包含错误信息的ValidationError对象(作为ValidationRule.Validate()方法的返回值)并将该对象添加到关联的Validation.Errors集合中
如果Binding.NotifyOnValidationError属性设置为true,WPF就在元素上引发Validation.Error附加事件
当发生错误时,绑定控件的可视化外观也会发生变化。当控件的Validation.HasError附加属性设置为true时,WPF自动将控件使用的模板切换成Validation.ErrprTemplate附加属性定义的模板。在文本框中,新模板将文本框的轮廓改成一条红色的边框。
在大多数情况下,我们都希望用某种方式来增强提示,并提供与引发问题的错误相关的信息。这样Error事件才有意义。我们可以通过代码处理Error事件或者提供自定义模板,从而提供不同的可视化指示信息。
INotifyDataErrorInfo接口