方法: プロパティをカスタムの SharePoint プロジェクト項目の種類に追加する
カスタムの SharePoint プロジェクト項目の種類を定義する場合は、プロジェクト項目にプロパティを追加できます。プロパティは、ソリューション エクスプローラーでプロジェクト項目を選択したときに [プロパティ] ウィンドウに表示されます。
次の手順は、独自の SharePoint プロジェクト項目の種類が既に定義されていることを前提としています。詳細については、「方法: SharePoint プロジェクト項目の種類を定義する」を参照してください。
プロジェクト項目の種類の定義にプロパティを追加するには
カスタム プロジェクト項目の種類に追加するプロパティを表すパブリック プロパティを使用して、クラスを定義します。複数のプロパティをカスタムのプロジェクト項目の種類に追加する場合は、すべてのプロパティを同じクラスまたは異なるクラスで定義できます。
ISharePointProjectItemTypeProvider 実装の InitializeType メソッドで、projectItemTypeDefinition パラメーターの ProjectItemPropertiesRequested イベントを処理します。
ProjectItemPropertiesRequested イベントのイベント ハンドラーで、カスタム プロパティ クラスのインスタンスをイベント引数パラメーターの PropertySources コレクションに追加します。
例
次のコード例は、プロパティ例というプロパティをカスタムのプロジェクト項目の種類に追加する方法を示します。
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);
}
}
}
}
}
コードについて
ProjectItemPropertiesRequested イベントが発生するたびに CustomProperties クラスの同じインスタンスが使用されるように、このイベントが初めて発生したときにプロジェクト項目の Annotations プロパティにプロパティ オブジェクトを保存するコード例を次に示します。このコードは、このイベントが発生するたびにこのオブジェクトを取得します。Annotations プロパティを使用した、プロジェクト項目を含むデータの保存の詳細については、「カスタム データの SharePoint ツールの拡張機能への関連付け」を参照してください。
プロパティ値への変更を永続化するために、ExampleProperty の set アクセサーによって、プロパティが関連付けられている ISharePointProjectItem オブジェクトの ExtensionData プロパティに新しい値が保存されます。ExtensionData プロパティを使用した、プロジェクト項目を含むデータの永続化の詳細については、「SharePoint プロジェクト システムの拡張機能におけるデータの保存」を参照してください。
カスタム プロパティの動作の指定
[プロパティ] ウィンドウでカスタム プロパティの外観および動作を定義するには、プロパティ定義に System.ComponentModel 名前空間の属性を適用します。次の属性がさまざまなシナリオで役立ちます。
DisplayNameAttribute: [プロパティ] ウィンドウに表示されるプロパティの名前を指定します。
DescriptionAttribute: プロパティを選択したときに [プロパティ] ウィンドウの下部に表示される説明文字列を指定します。
DefaultValueAttribute: プロパティの既定値を指定します。
TypeConverterAttribute: [プロパティ] ウィンドウに表示される文字列と非文字列のプロパティ値の間のカスタム変換を指定します。
EditorAttribute: プロパティの変更に使用するカスタム エディターを指定します。
コードのコンパイル
これらのコード例では、次のアセンブリへの参照を含むクラス ライブラリ プロジェクトが必要です。
Microsoft.VisualStudio.SharePoint
System.ComponentModel.Composition
プロジェクト項目の配置
自分が定義したプロジェクト項目を他の開発者が使用できるようにするには、プロジェクト テンプレートまたはプロジェクト項目テンプレートを作成します。詳細については、「SharePoint プロジェクト項目の項目テンプレートとプロジェクト テンプレートの作成」を参照してください。
プロジェクト項目を配置するには、同梱する必要のあるアセンブリやテンプレート、各種ファイルの Visual Studio 拡張機能 (VSIX) パッケージを作成します。詳細については、「Visual Studio での SharePoint ツールの拡張機能の配置」を参照してください。
参照
概念
方法: SharePoint プロジェクト項目の種類を定義する