Compartir a través de


Cómo: Agregar una propiedad a un tipo de elemento de proyecto personalizado de SharePoint

Cuando se define un tipo de elemento de proyecto de SharePoint personalizado, se puede agregar una propiedad al elemento de proyecto. La propiedad aparece en la ventana Propiedades cuando se selecciona el elemento de proyecto en el Explorador de soluciones.

En los siguientes pasos se supone que ha definido un tipo de elemento de proyecto de SharePoint. Para obtener más información, vea Cómo: Definir un tipo de elemento de proyecto de SharePoint.

Para agregar una propiedad a una definición de un tipo de elemento de proyecto

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

  2. En el método InitializeType de la implementación ISharePointProjectItemTypeProvider, controle el evento ProjectItemPropertiesRequested del parámetro projectItemTypeDefinition.

  3. En el controlador de eventos del evento ProjectItemPropertiesRequested, agregue una instancia de la clase de propiedades personalizada 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 a un tipo de elemento de proyecto personalizado.

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

Namespace Contoso.Examples.ProjectItemTypeWithProperty

    <Export(GetType(ISharePointProjectItemTypeProvider))> _
    <SharePointProjectItemType("Contoso.ExampleProjectItemType")> _
    <SharePointProjectItemIcon("ExampleProjectItemType.ProjectItemIcon.ico")> _
    Friend Class ExampleProjectItemTypeWithProperty
        Implements ISharePointProjectItemTypeProvider

        Private Sub InitializeType(ByVal projectItemTypeDefinition As ISharePointProjectItemTypeDefinition) _
            Implements ISharePointProjectItemTypeProvider.InitializeType
            projectItemTypeDefinition.Name = "ExampleProjectItemType"
            projectItemTypeDefinition.SupportedDeploymentScopes = _
                SupportedDeploymentScopes.Site Or SupportedDeploymentScopes.Web
            projectItemTypeDefinition.SupportedTrustLevels = SupportedTrustLevels.All

            AddHandler projectItemTypeDefinition.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.ProjectItemTypeWithProperty
{
    [Export(typeof(ISharePointProjectItemTypeProvider))]
    [SharePointProjectItemType("Contoso.ExampleProjectItemType")]
    [SharePointProjectItemIcon("ExampleProjectItemType.ProjectItemIcon.ico")]
    internal class ExampleProjectItemTypeWithProperty : ISharePointProjectItemTypeProvider
    {
        public void InitializeType(ISharePointProjectItemTypeDefinition projectItemTypeDefinition)
        {
            projectItemTypeDefinition.Name = "ExampleProjectItemType";
            projectItemTypeDefinition.SupportedDeploymentScopes =
                SupportedDeploymentScopes.Site | SupportedDeploymentScopes.Web;
            projectItemTypeDefinition.SupportedTrustLevels = SupportedTrustLevels.All;

            projectItemTypeDefinition.ProjectItemPropertiesRequested += 
                projectItemTypeDefinition_ProjectItemPropertiesRequested;
        }

        void projectItemTypeDefinition_ProjectItemPropertiesRequested(object sender, 
            SharePointProjectItemPropertiesRequestedEventArgs e)
        {
            CustomProperties property;

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

            e.PropertySources.Add(property);
        }
    }

    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);
                }
            }
        }
    }
}

Introducción al código

Para garantizar que se usa la misma instancia de la clase CustomProperties cada vez que se genera el evento ProjectItemPropertiesRequested, el ejemplo de código guarda el objeto de propiedades en 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 guardar 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.

Especificar 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 de código se requiere un proyecto de biblioteca de clases con referencias a los siguientes ensamblados:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Implementar el elemento de proyecto

Para permitir que otros desarrolladores usen el elemento de proyecto, cree una plantilla de proyecto o una plantilla de elemento de proyecto. Para obtener más información, vea Crear plantillas de elemento y plantillas de proyecto para los elementos de proyecto de SharePoint.

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

Vea también

Tareas

Cómo: Definir un tipo de elemento de proyecto de SharePoint

Otros recursos

Cómo: Agregar un elemento de menú contextual a un tipo de elemento de proyecto personalizado de SharePoint

Definir tipos de elementos de proyecto personalizados de SharePoint