Partager via


Comment : ajouter une propriété à un type d'élément de projet SharePoint personnalisé

Lorsque vous définissez un type d'élément de projet SharePoint personnalisé, vous pouvez ajouter une propriété à l'élément de projet.La propriété apparaît dans la fenêtre Propriétés dès lors que l'élément de projet est sélectionné dans l'Explorateur de solutions.

Les étapes suivantes supposent que vous avez déjà défini votre propre type d'élément de projet SharePoint.Pour plus d'informations, consultez Comment : définir un type d'élément de projet SharePoint.

Pour ajouter une propriété à une définition d'un type d'élément de projet

  1. Définissez une classe avec une propriété publique représentant la propriété que vous ajoutez au type d'élément de projet personnalisé.Si vous voulez ajouter plusieurs propriétés à un type d'élément de projet personnalisé, vous pouvez définir toutes les propriétés dans la même classe ou dans différentes classes.

  2. Dans la méthode InitializeType de votre implémentation ISharePointProjectItemTypeProvider, gérez l'événement ProjectItemPropertiesRequested du paramètre projectItemTypeDefinition.

  3. Dans le gestionnaire d'événements de l'événement ProjectItemPropertiesRequested, ajoutez une instance de votre classe de propriétés personnalisées à la collection PropertySources du paramètre d'arguments d'événement.

Exemple

L'exemple de code suivant montre comment ajouter une propriété nommée Example Property (Exemple de propriété) à un type d'élément de projet personnalisé.

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

Ee791683.collapse_all(fr-fr,VS.110).gifFonctionnement du code

Pour garantir que la même instance de la classe CustomProperties est utilisée chaque fois que l'événement ProjectItemPropertiesRequested a lieu, l'exemple de code enregistre l'objet de propriétés dans la propriété Annotations de l'élément de projet la première fois que cet événement se produit.Le code extrait cet objet chaque fois que cet événement se produit à nouveau.Pour plus d'informations sur l'utilisation de la propriété Annotations afin d'enregistrer des données avec des éléments de projet, consultez Association de données personnalisées à des extensions d'outils SharePoint.

Pour rendre persistantes les modifications apportées à la valeur de propriété, l'accesseur set pour ExampleProperty enregistre la nouvelle valeur dans la propriété ExtensionData de l'objet ISharePointProjectItem auquel la propriété est associée.Pour plus d'informations sur l'utilisation de la propriété ExtensionData afin de rendre persistantes les données avec les éléments de projet, consultez Enregistrement des données dans les extensions du système de projet SharePoint.

Ee791683.collapse_all(fr-fr,VS.110).gifSpécification du comportement des propriétés personnalisées

Vous pouvez définir la manière dont une propriété personnalisée apparaît et se comporte dans la fenêtre Propriétés en appliquant des attributs de l'espace de noms System.ComponentModel à la définition de la propriété.Les attributs suivants sont utiles dans de nombreux scénarios :

  • DisplayNameAttribute : spécifie le nom de la propriété qui s'affiche dans la fenêtre Propriétés.

  • DescriptionAttribute : spécifie la chaîne de description qui s'affiche en bas de la fenêtre Propriétés lorsque la propriété est sélectionnée.

  • DefaultValueAttribute : spécifie la valeur par défaut de la propriété.

  • TypeConverterAttribute : spécifie une conversion personnalisée entre la chaîne affichée dans la fenêtre Propriétés et une valeur de propriété non-chaîne.

  • EditorAttribute : spécifie un éditeur personnalisé à utiliser pour modifier la propriété.

Compilation du code

Ces exemples de code requièrent un projet de bibliothèque de classes avec des références aux assemblys suivants :

  • Microsoft.VisualStudio.SharePoint

  • System.ComponentModel.Composition

Déploiement de l'élément de projet

Pour donner à d'autres développeurs la possibilité d'utiliser votre élément de projet, créez un modèle de projet ou un modèle d'élément de projet.Pour plus d'informations, consultez Création de modèles d'élément et de modèles de projet pour les éléments de projet SharePoint.

Pour déployer l'élément de projet, créez un package d'extension Visual Studio (VSIX) pour l'assembly, le modèle et tous les autres fichiers que vous voulez distribuer avec l'élément de projet.Pour plus d'informations, consultez Déploiement d'extensions pour les outils SharePoint dans Visual Studio.

Voir aussi

Concepts

Comment : définir un type d'élément de projet SharePoint

Comment : ajouter un élément de menu contextuel à un type d'élément de projet SharePoint personnalisé

Définition de types d'éléments de projet SharePoint personnalisés