次の方法で共有


方法: SharePoint プロジェクト項目の拡張機能にプロパティを追加する

プロジェクト項目の拡張機能を使用して、既に Visual Studio にインストールされている任意の SharePoint プロジェクト項目にプロパティを追加できます。 プロパティは、ソリューション エクスプローラーでプロジェクト項目を選択したときに [プロパティ] ウィンドウに表示されます。

次の手順は、プロジェクト項目の拡張機能が既に作成されていることを前提としています。 詳細については、「方法: SharePoint プロジェクト項目の拡張機能を作成する」を参照してください。

プロジェクト項目の拡張機能にプロパティを追加するには

  1. プロジェクト項目の種類に追加するプロパティを表すパブリック プロパティを使用して、クラスを定義します。 複数のプロパティをプロジェクト項目の種類に追加する場合は、すべてのプロパティを同じクラスまたは異なるクラスで定義できます。

  2. ISharePointProjectItemTypeExtension 実装の Initialize メソッドで、projectItemType パラメーターの ProjectItemPropertiesRequested イベントを処理します。

  3. ProjectItemPropertiesRequested イベントのイベント ハンドラーで、プロパティ クラスのインスタンスをイベント引数パラメーターの PropertySources コレクションに追加します。

次のコード例は、[Example Property] というプロパティをイベント レシーバー プロジェクト項目に追加する方法を示します。

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

Namespace Contoso.Examples.ProjectItemExtensionWithProperty

    <Export(GetType(ISharePointProjectItemTypeExtension))> _
    <SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.EventHandler")> _
    Friend Class ExampleProjectItemExtensionWithProperty
        Implements ISharePointProjectItemTypeExtension

        Private Sub Initialize(ByVal projectItemType As ISharePointProjectItemType) _
            Implements ISharePointProjectItemTypeExtension.Initialize
            AddHandler projectItemType.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.ProjectItemExtensionWithProperty
{
    [Export(typeof(ISharePointProjectItemTypeExtension))]
    [SharePointProjectItemType("Microsoft.VisualStudio.SharePoint.EventHandler")]
    internal class ExampleProjectItemExtensionWithProperty : ISharePointProjectItemTypeExtension
    {
        public void Initialize(ISharePointProjectItemType projectItemType)
        {
            projectItemType.ProjectItemPropertiesRequested += 
                projectItemType_ProjectItemPropertiesRequested;
        }

        void projectItemType_ProjectItemPropertiesRequested(object sender, 
            SharePointProjectItemPropertiesRequestedEventArgs e)
        {
            CustomProperties propertyObject;

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

            e.PropertySources.Add(propertyObject);
        }
    }

    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

拡張機能の配置

拡張機能を配置するには、アセンブリと、拡張機能に同梱する必要のあるその他のファイルを提供するための Visual Studio Extension (VSIX) パッケージを作成します。 詳細については、「Visual Studio での SharePoint ツールの拡張機能の配置」を参照してください。

参照

処理手順

チュートリアル: SharePoint プロジェクト項目の種類の拡張

その他の技術情報

方法: SharePoint プロジェクト項目の拡張機能を作成する

方法: ショートカット メニュー項目を SharePoint プロジェクト項目の拡張機能に追加する

SharePoint プロジェクト項目の拡張