使用 Reset 和 ShouldSerialize 控制属性

本文介绍如何创建 Reset<PropertyName>ShouldSerialize<PropertyName> 方法来管理 Visual Studio 中 “属性” 窗口的属性。 您可以为属性提供ResetShouldSerialize可选方法,前提是该属性没有简单的默认值。 如果属性具有简单的默认值,则应使用 DefaultValueAttribute 并将默认值传递给特性类构造函数。 这两种机制都支持设计器中的以下功能:

  • 如果属性已从其默认值修改,则此属性在属性浏览器中提供视觉指示。
  • 用户可以右键单击该属性,然后选择 “重置” 将属性还原为其默认值。
  • 设计器生成更高效的代码。

有关属性的详细信息,请参阅 Reset 和 ShouldSerialize

辅助代码

本文通过创建指南针玫瑰控件来演示 ResetShouldSerialize 方法。 如果使用的是自己的用户控件,则可以跳过本部分。

  1. 将以下枚举添加到代码:

    public enum Directions
    {
        None,
        North,
        NorthEast,
        East,
        SouthEast,
        South,
        SouthWest,
        West,
        NorthWest,
    }
    
    Public Enum Directions
        None
        North
        NorthEast
        East
        SouthEast
        South
        SouthWest
        West
        NorthWest
    End Enum
    
  2. 添加名为 CompassRose 的用户控件。

  3. 将名为 Direction 类型的 Directions 属性添加到用户控件。

    public Directions Direction { get; set; } = Directions.None;
    
    Public Property Direction As Directions = Directions.None
    

重置

该方法 Reset<PropertyName> 将相应的 <PropertyName> 属性重置为其默认值。

以下代码将属性重置 DirectionNone,该属性被视为指南针玫瑰控件的默认值:

private void ResetDirection() =>
    Direction = Directions.None;
Private Sub ResetDirection()
    Direction = Directions.None
End Sub

ShouldSerialize

ShouldSerialize<PropertyName> 方法返回一个布尔值,该值指示后备属性是否已从其默认值更改,以及是否应将其序列化为设计器的代码。

Direction属性不等于None时,以下代码返回 true,表示已选择一个方向:

private bool ShouldSerializeDirection() =>
    Direction != Directions.None;
Private Function ShouldSerializeDirection() As Boolean
    Return Direction <> Directions.None
End Function

示例:

以下代码显示了 Direction 属性的 ResetShouldSerialize 方法:

public partial class CompassRose : UserControl
{
    public Directions Direction { get; set; } = Directions.None;

    public CompassRose() =>
        InitializeComponent();

    private void ResetDirection() =>
        Direction = Directions.None;

    private bool ShouldSerializeDirection() =>
        Direction != Directions.None;
}
Public Class CompassRose

    Public Property Direction As Directions = Directions.None

    Private Sub ResetDirection()
        Direction = Directions.None
    End Sub

    Private Function ShouldSerializeDirection() As Boolean
        Return Direction <> Directions.None
    End Function

End Class