属性编辑体系结构
[本文档仅供预览,在以后的发行版中可能会发生更改。包含的空白主题用作占位符。]
以可视方式编辑对象属性是 适用于 Visual Studio 的 WPF 设计器的一个重要功能。 本主题描述 WPF Designer属性编辑系统的体系结构。
属性项
PropertyEntry 类表示属性本身。 PropertyValue 类表示属性的基础值。
类别编辑器
类别编辑器允许最终用户同时编辑一个类别中的多个属性。 与类别编辑器相关联的属性不显示在“属性”窗口中的其他位置。 没有经过该类别编辑器编辑的属性将可见而且可编辑。 您可以指定类别编辑器要编辑某个类别中的哪些属性。
属性值编辑器
属性值编辑器定义如何在可视化设计器的“属性”窗口中显示和编辑特定类型。 属性值编辑器在 WPF Designer中扮演的角色与 UITypeEditor 类在 System.ComponentModel 体系结构中的角色相似。 但是,WPF Designer编辑器与 System.ComponentModel 和 Windows 窗体体系结构无关。
PropertyValueEditor 具有下表中列出的部件。
属性值编辑器的部件 |
说明 |
---|---|
内联编辑器(又称为“视图”) |
与承载“属性”窗口中的视图承载于同一物理空间中的编辑器。 例如,Margin 属性编辑器。 |
扩展编辑器 |
通常不就地承载的编辑器。 这是 System.ComponentModel 体系结构中下拉样式编辑器的等效编辑器。 例如,HorizontalAlignment 属性编辑器。 |
对话框 |
在其各自的对话框中实现的编辑器。 例如,RowDefinitions 属性编辑器。 |
对于视图和内联编辑器部件,可以使用默认值。 PropertyValueEditor 不是提供扩展编辑器部件所必需的。
每个部件都是一个 WPF DataTemplate。 各个部件之间相互独立,可以单独使用。
承载“属性”窗口提供视图和编辑器四周的框架。 这允许宿主为各个编辑器提供一致的样式,并允许不同的宿主提供不同的样式。 例如,Expression Blend 和 Visual Studio 为各自的“属性”窗口提供的外观和行为就不相同。
WPF 数据绑定和一组标准的 WPF RoutedCommand 对象在宿主和 PropertyValueEditor 部件之间提供通信机制。
在最简单的情况下,值编辑器部件可以是包含标准 WPF 控件的 DataTemplate。 在更复杂的情况下,类型部件可以是引用自定义控件的 DataTemplate。
您可以实现三种不同类型的属性值编辑器,下表列出了这些编辑器。
属性值编辑器的类型 |
说明 |
---|---|
简单 |
该属性值编辑器由一个内联编辑器组成。 |
扩展 |
该属性值编辑器由一个内联编辑器和一个扩展编辑器组成。 |
对话框 |
该属性值编辑器由一个内联编辑器和一个对话框组成。 |
基础结构类
基础结构类是任何属性值编辑器实现所必需的。 这些类由用来承载或创作值编辑器的核心基础结构组成,下表列出了这些类。
基础结构类 |
说明 |
---|---|
表示属性的值。 |
|
值编辑器的基类。 |
|
这些命令的处理程序的 RoutedCommand 类型和默认实现。 |
|
对话框值编辑器的抽象基类。
|
属性值编辑器的实现
下面几节描述属性值编辑器实现的各个方面。
Value、StringValue 和 Collection
PropertyValue 模型有三个与属性值相关的属性。 下表列出了这些 PropertyValue 属性。
PropertyValue 属性 |
说明 |
---|---|
数据的对象表示形式。 |
|
数据的字符串表示形式,可用于显示或序列化。 |
|
数据的集合表示形式。 |
StringValue 是数据的字符串表示形式,可用于显示或序列化。 Value 和 StringValue 缓存任何集合调用。
在设置 Value 时,StringValue 的缓存会被刷新。 常见方案是支持(在用户键入时)动态更新所设计的属性,其中 StringValue 的数据绑定到文本输入。 但是,只有当动态文本满足某些条件时,才设置基础属性。
PropertyValueEditor 要求
正确实现的属性值编辑器必须满足下列要求。
属性值编辑器必须按照内联编辑器部件和扩展编辑器部件可以独立使用的方式进行设计。
属性值编辑器不得存储状态。 属性值编辑器是无状态的,可以由宿主实现来缓存,而且可以在多个属性值之间重用。
属性值编辑器不得假定在给定时间只有一个值编辑器部件(视图/内联/扩展)控件处于活动状态。 例如,对话框的视图部件、内联部件和扩展 UI 部件可以同时处于活动状态。
作为属性值编辑器的部件实现的控件不得存储状态。 作为值编辑器的部件实现的控件不应当假定它将仅绑定到一个属性值。 可以对控件进行回收以更改不同的属性值。 如果数据模型发生更新,所缓存的任何信息也应当刷新。
作为属性值编辑器的部件实现的控件不得针对宿主或其父控件进行任何假设。 能够使用的通信机制仅限于:PropertyValue 数据模型(通过 DataContext)以及一组标准的命令。