Condividi tramite


Procedura: aggiungere una proprietà a un tipo di elemento di progetto SharePoint personalizzato

Quando si definisce un tipo di elemento di progetto SharePoint personalizzato, è possibile aggiungere una proprietà all'elemento di progetto. La proprietà viene visualizzata nella finestra Proprietà quando l'elemento di progetto viene selezionato in Esplora soluzioni.

I passaggi seguenti presuppongono che sia già stato definito il tipo di elemento di progetto SharePoint personalizzato. Per ulteriori informazioni vedere Procedura: definire un tipo di elemento di progetto SharePoint.

Per aggiungere una proprietà a una definizione di un tipo di elemento di progetto

  1. Definire una classe con una proprietà pubblica che rappresenta la proprietà da aggiungere al tipo di elemento di progetto personalizzato. Se si desidera aggiungere più proprietà a un tipo di elemento di progetto personalizzato, è possibile definire tutte le proprietà nella stessa classe o in classi diverse.

  2. Nel metodo InitializeType dell'implementazione di ISharePointProjectItemTypeProvider gestire l'evento ProjectItemPropertiesRequested del parametro projectItemTypeDefinition.

  3. Nel gestore dell'evento ProjectItemPropertiesRequested aggiungere un'istanza della classe di proprietà personalizzata all'insieme PropertySources del parametro degli argomenti dell'evento.

Esempio

Nell'esempio di codice seguente viene illustrato come aggiungere una proprietà denominata Example Property a un tipo di elemento di progetto personalizzato.

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

Informazioni sul codice

Per garantire che ogni volta che si verifica l'evento ProjectItemPropertiesRequested venga utilizzata la stessa istanza della classe CustomProperties, nell'esempio di codice l'oggetto delle proprietà viene salvato nella proprietà Annotations dell'elemento di progetto la prima volta che si verifica questo evento. Il codice recupera questo oggetto ogni volta che si verifica di nuovo questo evento. Per ulteriori informazioni sull'utilizzo della proprietà Annotations per salvare i dati con gli elementi di progetto, vedere Associazione di dati personalizzati alle estensioni degli strumenti di SharePoint.

Per rendere persistenti le modifiche al valore della proprietà, la funzione di accesso set della proprietà ExampleProperty salva il nuovo valore nella proprietà ExtensionData dell'oggetto ISharePointProjectItem a cui è associata la proprietà. Per ulteriori informazioni sull'utilizzo della proprietà ExtensionData per rendere persistenti i dati con gli elementi di progetto, vedere Salvataggio dei dati nelle estensioni del sistema di progetto SharePoint.

Specifica del comportamento delle proprietà personalizzate

È possibile definire la modalità di visualizzazione e il comportamento di una proprietà personalizzata nella finestra Proprietà applicando alla definizione di proprietà gli attributi ottenuti dallo spazio dei nomi System.ComponentModel. Gli attributi seguenti sono utili in molti scenari:

  • DisplayNameAttribute: specifica il nome della proprietà visualizzata nella finestra Proprietà.

  • DescriptionAttribute: specifica la stringa descrittiva visualizzata nella parte inferiore della finestra Proprietà quando si seleziona la proprietà.

  • DefaultValueAttribute: specifica il valore predefinito della proprietà.

  • TypeConverterAttribute: specifica una conversione personalizzata tra la stringa visualizzata nella finestra Proprietà e un valore di proprietà non di tipo stringa.

  • EditorAttribute: specifica un editor personalizzato da utilizzare per modificare la proprietà.

Compilazione del codice

Per questi esempi di codice è necessario un progetto Libreria di classi con riferimenti agli assembly seguenti:

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Distribuzione dell'elemento di progetto

Per consentire ad altri sviluppatori di utilizzare l'elemento di progetto, creare un modello di progetto o un modello di elemento di progetto. Per ulteriori informazioni, vedere Creazione di modelli di elemento e di modelli di progetto per gli elementi di progetto SharePoint.

Per distribuire l'elemento di progetto, creare un pacchetto Visual Studio Extension (VSIX) per l'assembly, il modello e qualsiasi altro file che si desidera distribuire con l'elemento di progetto. Per ulteriori informazioni, vedere Distribuzione di estensioni per gli strumenti di SharePoint in Visual Studio.

Vedere anche

Attività

Procedura: definire un tipo di elemento di progetto SharePoint

Altre risorse

Procedura: aggiungere una voce di menu di scelta rapida a un tipo di elemento di progetto SharePoint personalizzato

Definizione di tipi di elementi di progetto SharePoint