属性编辑体系结构

更新:2007 年 11 月

以可视方式编辑对象属性是 Visual Studio Windows Presentation Foundation (WPF) 设计器的一个重要功能。本主题描述 WPF 设计器属性编辑系统的体系结构。

属性项

PropertyEntry 类表示属性本身。PropertyValue 类表示属性的基础值。

类别编辑器

类别编辑器允许最终用户同时编辑一个类别中的多个属性。与类别编辑器相关联的属性不显示在“属性”窗口中的其他位置。没有经过该类别编辑器编辑的属性将可见而且可编辑。您可以指定类别编辑器要编辑某个类别中的哪些属性。

属性值编辑器

属性值编辑器定义如何在可视化设计器的“属性”窗口中显示和编辑特定类型。属性值编辑器在 WPF 设计器中扮演的角色与 UITypeEditor 类在 System.ComponentModel 体系结构中的角色相似。但是,WPF 设计器编辑器与 System.ComponentModel 和 Windows 窗体体系结构无关。

PropertyValueEditor 具有下表中列出的部件。

属性值编辑器的部件

说明

内联编辑器(又称为“视图”)

与宿主“属性”窗口中的视图承载于同一个物理空间中的编辑器。例如,Margin 属性编辑器。

扩展编辑器

通常不就地承载的编辑器。这是 System.ComponentModel 体系结构中下拉样式编辑器的等效编辑器。例如,HorizontalAlignment 属性编辑器。

对话框

在其各自的对话框中实现的编辑器。例如,RowDefinitions 属性编辑器。

对于视图和内联编辑器部件,可以使用默认值。PropertyValueEditor 不是提供扩展编辑器部件所必需的。

每个部件都是一个 WPF DataTemplate。各个部件之间相互独立,可以单独使用。

宿主“属性”窗口提供视图和编辑器四周的框架。这允许宿主为各个编辑器提供一致的样式,并允许不同的宿主提供不同的样式。例如,Expression Blend 和 Visual Studio 为各自的“属性”窗口提供的外观和行为就不相同。

WPF 数据绑定和一组标准的 WPF RoutedCommand 对象在宿主和 PropertyValueEditor 部件之间提供通信机制。

在最简单的情况下,值编辑器部件可以是包含标准 WPF 控件的 DataTemplate。在更复杂的情况下,类型部件可以是引用自定义控件的 DataTemplate

您可以实现四种不同类型的属性值编辑器,下表列出了这些编辑器。

属性值编辑器的类型

说明

简单

该属性值编辑器由一个内联编辑器组成。

扩展

该属性值编辑器由一个内联编辑器和一个扩展编辑器组成。

对话框

该属性值编辑器由一个内联编辑器和一个对话框组成。

基础结构类

基础结构类是任何属性值编辑器实现所必需的。这些类由用来承载或创作值编辑器的核心基础结构组成,下表列出了这些类。

基础结构类

说明

PropertyValue

表示属性的值。

PropertyValueEditor

值编辑器的基类。

PropertyValueEditorCommands

这些命令的处理程序的 RoutedCommand 类型和默认实现。

DialogPropertyValueEditor

对话框值编辑器的抽象基类。

  • 定义 ShowDialog 命令及其默认的处理程序。

  • 具有默认的视图和内联编辑器模板。

  • PropertyValueEditor 标记为对话框编辑器。

属性值编辑器的实现

下面几节描述属性值编辑器实现的各个方面。

Value、StringValue 和 Collection

PropertyValue 模型有三个与属性值相关的属性。下表列出了这些 PropertyValue 属性。

PropertyValue 属性

说明

Value

数据的对象表示形式。

StringValue

数据的字符串表示形式,可用于显示或序列化。

Collection

数据的集合表示形式。

StringValue 是数据的字符串表示形式,可用于显示或序列化。Value 和 StringValue 缓存任何集合调用。

在设置 Value 时,StringValue 的缓存将刷新。在设置 ImmediateValue 时,Value 的缓存将刷新。这意味着在设置 ImmediateValue 时,Value 和 StringValue 的缓存均刷新。

常见方案是支持(在用户键入时)动态更新所设计的属性,其中 StringValue 的数据绑定到文本输入。但是,只有当动态文本满足某些条件时,才设置基础属性。

PropertyValueEditor 要求

正确实现的属性值编辑器必须满足下列要求。

  • 属性值编辑器必须按照内联编辑器部件和扩展编辑器部件可以独立使用的方式进行设计。

  • 属性值编辑器不得存储状态。属性值编辑器是无状态的,可以由宿主实现来缓存,而且可以在多个属性值之间重用。

  • 属性值编辑器不得假定在给定时间只有一个值编辑器部件(视图/内联/扩展)控件处于活动状态。例如,对话框的视图部件、内联部件和扩展 UI 部件可以同时处于活动状态。

  • 作为属性值编辑器的部件实现的控件不得存储状态。作为值编辑器的部件实现的控件不应当假定它将仅绑定到一个属性值。可以对控件进行回收以更改不同的属性值。如果数据模型发生更新,所缓存的任何信息也应当刷新。

  • 作为属性值编辑器的部件实现的控件不得针对宿主或其父控件进行任何假设。能够使用的通信机制仅限于:PropertyValue 数据模型(通过 DataContext)以及一组标准的命令。

请参见

参考

PropertyEntry

PropertyValue

PropertyValueEditor

其他资源

WPF 设计器扩展性