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
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.
En el método InitializeType de la implementación ISharePointProjectItemTypeProvider, controle el evento ProjectItemPropertiesRequested del parámetro projectItemTypeDefinition.
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
Definir tipos de elementos de proyecto personalizados de SharePoint