WPF进阶技巧和实战08-依赖属性与绑定02 (3)

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接口

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjzpy.html