Compartir a través de


Cómo: Agregar una propiedad a una extensión de elemento de proyecto de SharePoint

Puede usar una extensión de elemento de proyecto para agregar una propiedad a cualquier elemento de proyecto de SharePoint que ya se encuentre instalado en Visual Studio.La propiedad aparece en la ventana Propiedades cuando se selecciona el elemento de proyecto en el Explorador de soluciones.

En los siguientes pasos se da por supuesto que ha creado una extensión de elemento de proyecto.Para obtener más información, vea Cómo: Crear una extensión de elemento de proyecto de SharePoint.

Para agregar una propiedad a una extensión de elemento de proyecto

  1. Defina una clase con una propiedad pública que represente la propiedad que va a agregar a un tipo de elemento de proyecto.Si desea agregar varias propiedades a un tipo de elemento de proyecto, puede definirlas todas en la misma clase o en clases diferentes.

  2. En el método Initialize de la implementación ISharePointProjectItemTypeExtension, controle el evento ProjectItemPropertiesRequested del parámetro projectItemType.

  3. En el controlador de eventos del evento ProjectItemPropertiesRequested, agregue una instancia de la clase de propiedades a la colección PropertySources del parámetro de argumentos del evento.

Ejemplo

En el siguiente ejemplo de código se muestra cómo agregar una propiedad denominada Example Property al elemento de proyecto de receptor de eventos.

Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Composition
Imports Microsoft.VisualStudio.SharePoint

Namespace Contoso.Examples.ProjectItemExtensionWithProperty

    <Export(GetType(ISharePointProjectItemTypeExtension))> _
    <SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.EventHandler")> _
    Friend Class ExampleProjectItemExtensionWithProperty
        Implements ISharePointProjectItemTypeExtension

        Private Sub Initialize(ByVal projectItemType As ISharePointProjectItemType) _
            Implements ISharePointProjectItemTypeExtension.Initialize
            AddHandler projectItemType.ProjectItemPropertiesRequested, AddressOf ProjectItemPropertiesRequested
        End Sub

        Private Sub ProjectItemPropertiesRequested(ByVal Sender As Object,
            ByVal e As SharePointProjectItemPropertiesRequestedEventArgs)
            Dim propertyObject As CustomProperties = Nothing

            ' If the properties object already exists, get it from the project item's annotations.
            If False = e.ProjectItem.Annotations.TryGetValue(propertyObject) Then
                ' Otherwise, create a new properties object and add it to the annotations.
                propertyObject = New CustomProperties(e.ProjectItem)
                e.ProjectItem.Annotations.Add(propertyObject)
            End If
            e.PropertySources.Add(propertyObject)
        End Sub
    End Class

    Friend Class CustomProperties
        Private projectItem As ISharePointProjectItem

        Friend Sub New(ByVal projectItem As ISharePointProjectItem)
            Me.projectItem = projectItem
        End Sub

        Private Const TestPropertyId As String = "Contoso.ExampleProperty"
        Private Const PropertyDefaultValue As String = "This is an example property."

        <DisplayName("Example Property")> _
        <DescriptionAttribute("This is an example property for project items.")> _
        <DefaultValue(PropertyDefaultValue)> _
        Public Property ExampleProperty As String
            Get
                Dim propertyValue As String = Nothing

                ' Get the current property value if it already exists; otherwise, return a default value.
                If False = projectItem.ExtensionData.TryGetValue(TestPropertyId, propertyValue) Then
                    propertyValue = PropertyDefaultValue
                End If
                Return propertyValue
            End Get
            Set(ByVal value As String)
                If value <> PropertyDefaultValue Then
                    ' Store the property value in the ExtensionData property of the project item.
                    ' Data in the ExtensionData property persists when the project is closed.
                    projectItem.ExtensionData(TestPropertyId) = value
                Else
                    ' Do not save the default value.
                    projectItem.ExtensionData.Remove(TestPropertyId)
                End If
            End Set
        End Property
    End Class
End Namespace
using System;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.SharePoint;

namespace Contoso.Examples.ProjectItemExtensionWithProperty
{
    [Export(typeof(ISharePointProjectItemTypeExtension))]
    [SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.EventHandler")]
    internal class ExampleProjectItemExtensionWithProperty : ISharePointProjectItemTypeExtension
    {
        public void Initialize(ISharePointProjectItemType projectItemType)
        {
            projectItemType.ProjectItemPropertiesRequested += 
                projectItemType_ProjectItemPropertiesRequested;
        }

        void projectItemType_ProjectItemPropertiesRequested(object sender, 
            SharePointProjectItemPropertiesRequestedEventArgs e)
        {
            CustomProperties propertyObject;

            // If the properties object already exists, get it from the project item's annotations.
            if (!e.ProjectItem.Annotations.TryGetValue(out propertyObject))
            {
                // Otherwise, create a new properties object and add it to the annotations.
                propertyObject = new CustomProperties(e.ProjectItem);
                e.ProjectItem.Annotations.Add(propertyObject);
            }

            e.PropertySources.Add(propertyObject);
        }
    }

    internal class CustomProperties
    {
        private ISharePointProjectItem projectItem;

        internal CustomProperties(ISharePointProjectItem projectItem)
        {
            this.projectItem = projectItem;
        }

        private const string PropertyId = "Contoso.ExampleProperty";
        private const string PropertyDefaultValue = "This is an example property.";

        [DisplayName("Example Property")]
        [DescriptionAttribute("This is an example property for project items.")]
        [DefaultValue(PropertyDefaultValue)]
        public string ExampleProperty
        {
            get
            {
                string propertyValue;

                // Get the current property value if it already exists; otherwise, return a default value.
                if (!projectItem.ExtensionData.TryGetValue(PropertyId, out propertyValue))
                {
                    propertyValue = PropertyDefaultValue;
                }
                return propertyValue;
            }
            set
            {
                if (value != PropertyDefaultValue)
                {
                    // Store the property value in the ExtensionData property of the project item. 
                    // Data in the ExtensionData property persists when the project is closed.
                    projectItem.ExtensionData[PropertyId] = value;
                }
                else
                {
                    // Do not save the default value.
                    projectItem.ExtensionData.Remove(PropertyId);
                }
            }
        }
    }
}

Ee471435.collapse_all(es-es,VS.110).gifIntroducción al código

Para garantizar que se usa la misma instancia de la clase CustomProperties cada vez que se genera el evento ProjectItemPropertiesRequested, en el ejemplo de código se agrega el objeto de propiedades a la propiedad Annotations del elemento de proyecto la primera vez que se genera este evento.El código recupera este objeto cada vez que el evento se genera.Para obtener más información sobre el uso de la propiedad Annotations para asociar los datos con los elementos de proyecto, vea Asociar datos personalizados con extensiones de herramientas de SharePoint.

Para conservar los cambios en el valor de propiedad, el descriptor de acceso set de la propiedad ExampleProperty guarda el nuevo valor en la propiedad ExtensionData del objeto ISharePointProjectItem al que está asociada la propiedad.Para obtener más información sobre el uso de la propiedad ExtensionData para mantener los datos con los elementos de proyecto, vea Guardar datos asociados en extensiones del sistema de proyectos de SharePoint.

Ee471435.collapse_all(es-es,VS.110).gifEspecificar el comportamiento de las propiedades personalizadas

Puede definir el aspecto y comportamiento de una propiedad personalizada en la ventana Propiedades aplicando los atributos del espacio de nombres System.ComponentModel a la definición de la propiedad.Los siguientes atributos son útiles en muchos escenarios:

  • DisplayNameAttribute: especifica el nombre de la propiedad que aparece en la ventana Propiedades.

  • DescriptionAttribute: especifica la cadena descriptiva que aparece en la parte inferior de la ventana Propiedades cuando la propiedad está seleccionada.

  • DefaultValueAttribute especifica el valor predeterminado de la propiedad.

  • TypeConverterAttribute: especifica una conversión personalizada entre la cadena que se muestra en la ventana Propiedades y un valor de propiedad que no es de cadena.

  • EditorAttribute: especifica un editor personalizado para modificar la propiedad.

Compilar el código

En estos ejemplos se requiere un proyecto de biblioteca de clases con referencias a los siguientes ensamblados:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Implementar la extensión

Para implementar la extensión, cree un paquete de extensión (VSIX) de Visual Studio para el ensamblado y el resto de archivos que desee distribuir con la extensión.Para obtener más información, vea Extensiones de implementación para las Herramientas de SharePoint en Visual Studio.

Vea también

Tareas

Tutorial: Extender un tipo de elemento de proyecto de SharePoint

Conceptos

Cómo: Crear una extensión de elemento de proyecto de SharePoint

Cómo: Agregar un elemento de menú contextual a una extensión de elemento de proyecto de SharePoint

Extender elementos de proyecto de SharePoint