向层关系图添加自定义属性

利用此 Visual Studio 2010 功能包,您可为 Visual Studio 2010 旗舰版中的层关系图上的元素定义自定义属性。 可让这些属性显示在**“属性”**窗口中,以便用户可查看和编辑它们。 有关更多信息,请参见 Visual Studio 功能包

层元素 (ILayerElement) 具有多个标准属性,例如 Name 和 Description。 用户可在**“属性”**窗口中编辑这些属性,并可通过程序代码读取和更新这些属性。

可定义可与任何层元素关联的您自己的属性。 执行此操作的最简单方式是,将值添加到将附加到每个 ILayerElement 的 Properties 字典。 如果您只需要在您自己的程序代码中使用属性,则这样做已足够。

但通过定义自定义属性,可以使用户能够在**“属性”**窗口中查看某个附加值。 自定义属性说明符是一个继承自 PropertyExtension<T> 的类,其中 T 为 ILayerElement 或其派生类之一。 T 是为其定义属性的类型。

例如,可在以下类型上定义属性:

  • ILayerModel - 模型

  • ILayer - 每层

  • ILayerDependencyLink - 层之间的链接

  • ILayerComment

  • ILayerCommentLink

提示

还有一个更简单的机制,用于存储字符串和任何 ILayerElement。 可将值放入附加到每个元素的 Properties 字典中。 这对于不希望用户直接编辑的数据很有用。 有关更多信息,请参见在程序代码中导航和更新层模型

示例

以下代码是典型的自定义属性描述符。 它在层模型 (ILayerModel) 上定义了一个布尔值属性,该属性允许用户为自定义验证方法提供值。

using System;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer;

namespace MyNamespace
{
  /// <summary>
  /// Custom properties are added to the Layer Designer via a custom
  /// Property Descriptor. We have to export this Property Descriptor
  /// using MEF to make it available in the Layer Designer.
  /// </summary>
  [Export(typeof(IPropertyExtension))]
  public class AllTypesMustBeReferencedProperty 
      : PropertyExtension<ILayerModel>
  {
    /// <summary>
    /// Each custom property must have a unique name. 
    /// Usually we use the full name of this class.
    /// </summary>
    public static readonly string FullName =
      typeof(AllTypesMustBeReferencedProperty).FullName;

    /// <summary>
    /// Construct the property. Notice the use of FullName.
    /// </summary>
    public AllTypesMustBeReferencedProperty()
            : base(FullName)
    {  }

    /// <summary>
    /// The display name is shown in the Properties window.
    /// We therefore use a localizable resource.
    /// </summary>
    public override string DisplayName
    {
      get { return Strings.AllTypesMustBeReferencedDisplayName; }
    }

    /// <summary>
    /// Description shown at the bottom of the Properties window.
    /// We use a resource string for easier localization.
    /// </summary>
    public override string Description
    {
      get { return Strings.AllTypesMustBeReferencedDescription; }
    }

    /// <summary>
    /// This is called to set a new value for this property. We must
    /// throw an exception if the value is invalid.
    /// </summary>
    /// <param name="component">The target ILayerElement</param>
    /// <param name="value">The new value</param>
    public override void SetValue(object component, object value)
    {
      ValidateValue(value);
      base.SetValue(component, value);
    }
    /// <summary>
    /// Helper to validate the value.
    /// </summary>
    /// <param name="value">The value to validate</param>
    private static void ValidateValue(object value)
    {  }

    public override Type PropertyType
    { get { return typeof(bool); } }

    /// <summary>
    /// The segment label of the properties window.
    /// </summary>
    public override string Category
    { 
      get
      {
        return Strings.AllTypesMustBeReferencedCategory;
      }
    }
  }
}

请参见

其他资源

创建层关系图的扩展