Service Manager 管理パックの XML ファイルを操作する
管理パックを詳細にカスタマイズするには、Service Manager コンソールと Service Manager オーサリング ツールでは不十分な場合があり、管理パック ファイルを直接作成または変更する必要がある場合があります。 管理パック ファイルを直接操作するには、System Center 共通スキーマや管理パックの構造など、いくつかの領域に関する詳細な知識が必要です。
このセクションでは、Service Manager をカスタマイズするための管理パックの作成と変更に役立つ背景情報とガイドラインについて説明します。
System Center の共通スキーマへの変更
Service Manager には、System Center 管理パック スキーマの更新バージョンが含まれています。 このスキーマは System Center Common Schema と呼ばれるようになり、既存の機能を強化し、Service Manager の機能を有効にすることを目的とした多くの機能強化と追加が含まれています。 この記事では、System Center 共通スキーマに対する変更について説明します。
プロパティとプロパティの制限
共通スキーマでは、いくつかの新しいプロパティ型によりクラスが拡張されます。 これらのプロパティ型には、バイナリ型、列挙子型、自動インクリメント型が含まれます。
さらに、特定のプロパティ値に制限を定義できます。 たとえば、文字列のプロパティ値に正規表現の制限を定義できます。 次の例では、 BuildingName プロパティに正規表現の制限が定義されているため、 Building その後にスペースと数値が続く値のみが有効と見なされます。
<ClassType ID="Lobby" Accessibility="Public" Base="System!System.Entity">
<Property ID="Id" Type="int" Key="true" />
<Property ID="BuildingName" Type="string" RegEx="Building [0-9]+" />
</ClassType>
画像
イメージは管理パック内に格納されません。 そのため、管理パックの <PresentationTypes>
セクションには、 <Images>
、 <Image>
、または <ImageData>
タグが含まれません。 代わりにイメージ リソースを使用します。
<Resources>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
列挙
共通スキーマは、列挙をサポートします。 列挙は値をツリー形式に示すもので、プロパティや属性の値を制限するのに使用できます。
列挙ごとに、一意の必須 ID 属性と、オプションの Parent 属性を持ちます。
次の例では、 XBoxState 列挙に、Running、Stopped、Error という 3 つの可能値が定義されています。
<EnumerationTypes>
<EnumerationValue ID="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Running" Parent="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Stopped" Parent="XBoxState" Accessibility="Public"/>
<EnumerationValue ID="XBoxState.Error" Parent="XBoxState" Accessibility="Public" />
<EnumerationValue ID="XBoxState.Error.RROD" Parent="XBoxState.Error" Accessibility="Public" />
</EnumerationTypes>
次の例では、 Xbox クラスにより、 enum 型の XBoxStateプロパティが定義されています。
<ClassType ID="XBox" Accessibility="Public" Base="System!System.ConfigItem" Hosted="true">
<Property ID="Id" Type="int" Key="true" />
<Property ID="Name" Type="string" />
<Property ID="State" Type="enum" EnumType="XBoxState" />
</ClassType>
リレーションシップ
共通スキーマにおいて、リレーションシップ定義の機能が強化されました。 RelationshipType 型には、表示名として使用できる Source プロパティと共にサブ要素 Target と ID が含まれるようになりました。 さらに、ソースとターゲットの両方に対して最小カーディナリティと最大カーディナリティを定義できます。たとえば、1 対 1、0 対多のリレーションシップなどです。
カーディナリティは管理パックの検証プロセスによって強制されませんが、管理パックのユーザー インターフェイスの定義に役立ちます。 たとえば、フォームでフィールドをテキスト ボックスまたはリストとして表示可能かどうかなど、カーディナリティにより確認できます。
重要
1 より大きな値として定義されている MaxCardinality 値はすべて無限大として処理されます。
独自の管理パックから新しいリレーションシップの種類を追加する場合、ユーザーが新しいリレーションシップの種類のインスタンスを作成するには、そのリレーションシップの種類のソースとターゲットのクラス インスタンスのすべてのプロパティを更新するのに必要な特権が条件となります。
次の例では、Lobby 型と Xbox 型の間に HasXboxes というホスティングリレーションシップが定義されています。 このリレーションシップ定義では、各 Lobby 型に複数の Xbox 型を指定できます。
<RelationshipType ID="HasXBboxes" Accessibility="Public" Base="System!System.Hosting">
<Source ID="Source" Type="Lobby" />
<Target ID="Target" Type="Xbox" MinCardinality="0" MaxCardinality="9999" />
</RelationshipType>
複合クラス
複合クラスは、管理パック内の関連する複数の型の集合を表し、Microsoft SQL Server データベースで定義された、複数のテーブルからデータを返すことのできるビューに似ています。 複合クラスは、データベースに対して 1 つの演算を実行することで、すべての集計データを保管および取得します。そのため、複合クラスを利用すると、管理パックのユーザー インターフェイスを簡単に定義できます。
次の例では、インシデント管理ビューのプロジェクションが定義されています。 このプロジェクションは、インシデントに関連する異なる複数のコンポーネントを 1 つのユニットとして統合します。そのため、フォームやデータベースの操作において、簡単に使用することができます。
<TypeProjections>
<TypeProjection ID="System.WorkItem.Incident.View.ProjectionType"
Accessibility="Public" Type="Incident!System.WorkItem.Incident">
<Component Alias="AffectedUser"
Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.Incident.View.DCMProjectionType" Accessibility="Public" Type="Incident!System.WorkItem.Incident.DCMIncident">
<Component Alias="AffectedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<!--Baseline and Configuration Item Information-->
<Component Alias="AffectedComputer" Path="$Target/Path[Relationship='Incident!System.WorkItem.Incident.DCMIncident.Refers.NonComplianceComputer']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.ChangeRequestViewProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">
<Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</TypeProjection>
<TypeProjection ID="System.WorkItem.ChangeRequestProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">
<Component Alias="Activity" Path="$Target/Path[Relationship='SMActivity!System.WorkItemContainsActivity']$">
<Component Alias="ActivityAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<Component Alias="ActivityRelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">
<Component Alias="ActivityRelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</Component>
<Component Alias="ActivityRelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>
<Component Alias="ActivityAboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>
<Component Alias="ActivityFileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">
<Component Alias="ActivityFileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</Component>
<Component Alias="Reviewer" Path="$Target/Path[Relationship='SMActivity!System.ReviewActivityHasReviewer']$">
<Component Alias="User" Path="$Target/Path[Relationship='SMActivity!System.ReviewerIsUser']$"/>
<Component Alias="VotedBy" Path="$Target/Path[Relationship='SMActivity!System.ReviewerVotedByUser']$"/>
</Component>
</Component>
<Component Alias="CreatedBy" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedByUser']$"/>
<Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
<Component Alias="CreatedFor" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>
<Component Alias="RelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">
<Component Alias="RelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>
</Component>
<Component Alias="RelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>
<Component Alias="AboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>
<Component Alias="FileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">
<Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</Component>
</TypeProjection>
<TypeProjection ID="System.FileAttachmentProjection" Accessibility="Public" Type="System!System.FileAttachment">
<Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>
</TypeProjection>
</TypeProjections>
コンソール タスク
コンソール タスクは、共通スキーマで拡張されます。 以前は、コンソール タスクはアプリケーション ディレクトリと実行可能ファイル名を示すシンプルなポインターでした。 現在では、コンソール タスクはハンドラー コードとして Microsoft .NET Framework アセンブリに実装されるようになりました。 ハンドラー コードは、コード、ハンドラー名、および引数としてハンドラーに渡すことが可能な名前付きの値のリストを格納するアセンブリを参照します。
次の例では、 Some.Handler.Name ハンドラーが、 MyLibrary.Resources.Assembly アセンブリに定義されています。 ハンドラーのパラメーターとその値のリストも定義されています。
<ConsoleTask ID="MyLibrary.ConsoleTasks.T1"
Accessibility="Public"
Target="System!System.Entity"
Enabled="true"
RequireOutput="true">
<Assembly>MyLibrary.Resources.Assembly1</Assembly>
<Handler>Some.Handler.Name</Handler>
<Parameters>
<Argument Name="Application">cmd.exe</Argument>
<Argument Name="WorkingDirectory">%TEMP%</Argument>
<Argument>test1</Argument>
<Argument>test2</Argument>
</Parameters>
</ConsoleTask>
リソース
バイナリ データは管理パックに直接格納されません。 通常、バイナリ リソースに関するメタデータが管理パックに保存され、実際のバイナリ データは外部のリソース ファイルに保存されます。 メタデータには、一意識別子、ファイル名、作成データ、変更日、およびアクセシビリティ情報が含まれます。
バイナリ データには、汎用リソース、イメージ、アセンブリ、レポート定義、フォームを含めることができます。 次の例は、汎用 XML リソース、アセンブリ リソース、レポート リソースを示しています。
<Resources>
<Resource ID="TestLibrary.Resources.Test1" Accessibility="Public" FileName="res1.xml"/>
<Resource ID="TestLibrary.Resources.Test2" Accessibility="Public" FileName="res2.xml"/>
<Assembly ID="TestLibrary.Resources.Assembly1" Accessibility="Public" QualifiedName="Baz, Version=1.0.0.0" FileName="baz.dll"/>
<Assembly ID="TestLibrary.Resources.Assembly2" Accessibility="Public" QualifiedName="Yoyo, Version=1.0.0.0" FileName="yoyo.dll">
<Dependency ID="TestLibrary.Resources.Assembly1"/>
</Assembly>
<ReportResource ID="TestLibrary.Resources.Report1" Accessibility="Public" MIMEType="text/xml" FileName="res1.xml"/>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
フォーム
フォームは管理パックで定義されます。 フォームを使用して、型の単一インスタンスまたは複合クラスを表示して編集できます。
フォームは Windows Presentation Framework (WPF) に基づいており、アセンブリで定義されます。 管理パックのフォーム実装を含むアセンブリとクラスは、管理パックの Resources セクションに含まれています。 新しい共通スキーマを使用する管理パック内のバイナリ リソースと同様に、管理パック自体にはフォームのバイナリ データは含まれません。 管理パックでは、リソース マニフェストが指定されているだけです。
管理パックのフォームに対して、独自の構成情報を指定できます。 次の例では、Configuration セクションに ShowXboxes プロパティが含まれています。 この構成情報は、管理パックの検証プロセスでは評価されません。これはフォーム実装によってのみ解釈されます。
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
プロジェクターを管理するための管理パック ファイルを作成する
管理パックは、Service Manager の機能を指示および拡張するために使用されます。 この記事では、プロジェクターを使用して、管理パックのさまざまなセクションを説明し、組織内のプロジェクターを管理するために必要なさまざまなオブジェクトを定義します。
この記事には、組織内のプロジェクターを管理するために必要な拡張機能を含む完全な管理パック サンプルが含まれています。 また、Windows PowerShell コマンドレットを使用して、管理パックをインポートする方法についても説明します。
この記事では、管理パックの次のセクションについて説明します。
Manifest
TypeDefinitions (クラス列挙とリレーションシップの作成に使用)
フォーム
この記事では、ユーザー インターフェイス (UI) 要素とローカライズ要素の宣言と定義を含む管理パックの次のセクションについても説明します。
カテゴリ
プレゼンテーション
クラスの拡張機能
[マニフェスト] セクション
管理パックの最初のセクションにはマニフェストが含まれます。 マニフェストは管理パックを識別し、他の管理パックへの参照を宣言します。
次の例は、組織のプロジェクターを追跡するように設計された管理パックの Manifest セクションを示したものです。
<Manifest>
<Identity>
<ID>ServiceManager.Projector_Authoring</ID>
<Version>7.0.3707.0</Version>
</Identity>
<Name>Projector Library</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConsole">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Authoring">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConfig">
<ID>ServiceManager.ConfigurationManagement.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
重要
References セクションでは、参照のエイリアスに '.' などの非ファンヌメリック値を使用しないでください。
TypeDefinitions セクションでクラスを作成する
管理パックの次のセクションには、型の定義が含まれます。 管理パックの TypeDefinitions セクションには、管理パックで使用されるクラス、列挙およびリレーションシップの定義が含まれます。
次の例は、プロジェクターについての情報を含むクラスを示したものです。
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
</ClassType>
</ClassTypes>
<RelationshipTypes>
</RelationshipTypes>
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>
</EnumerationTypes>
</EntityTypes>
</TypeDefinitions>
次に、型の定義の内容をセクションごとに説明します。
ClassTypes セクション
ClassType 要素がプロジェクターのクラスを定義します。
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
ID 属性がこのクラスの一意の識別子です。 次の設定が行われます。
ID="System.ConfigItem.Projector"
Base 属性は、このクラスの派生元クラスの ID です。 プロジェクターは構成アイテムの一種なので、次のように設定されています。
Base="System!System.ConfigItem"
System! の表記は、このクラス System.ConfigItem が、エイリアス System によって参照される管理パックにあることを示します。
Hosted 属性は、このクラスが他のクラスによってホストされているかどうかを定義します。 ホストされている場合、このクラスのインスタンスは、それを含むホスト インスタンスが存在するときのみ存在できます。 この例では、プロジェクターは何もホストされていません。したがって、 Hosted 属性は false に設定されます:
Hosted="false"
Hosted 属性に true を設定すると、そのクラスが別のクラスにホストされていることを示します。 ホスト リレーションシップは、 RelationshipTypes セクションで宣言されなければなりません。
Accessibility 属性は、このクラスから他のクラスが派生できるかどうかを定義します。 他が、クラスのより特化したバージョンを作成することを許可する場合には、次の例のように、この属性に publicを設定します。
Accessibility="Public"
Accessibility 属性に Internal を設定すると、他のクラスがこのクラスから派生できません。
Abstract 属性は、このクラスのインスタンスを作成できるかどうか、あるいは、このクラスは他のクラスが派生する親クラスとしてのみ使用できるかどうかを定義します。 この例では、この属性に falseが設定されています。 この属性に true を設定すると、このクラスはインスタンスを直接作成できず、親クラスとしてのみ使用できることを意味します。
クラス定義の次のセクションには、クラスのプロパティが含まれます。 次のサンプル コードでは、この例のクラスのプロパティが XML によって定義されています。
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
各 Property 要素には、次の属性があります。
ID 属性は、プロパティの一意の識別子を指定します。
Type 属性は、プロパティのデータ型を示します。
Key 属性。 この属性を true に設定すると、このプロパティがこのクラスを一意に識別するのに使用されることを示します。
列挙型を作成する
enum データ型の列挙は特別なデータ型です。 列挙は、あるプロパティに使用できるデータを特別な値セットに制限するために使用されます。 列挙には階層を持つことができ、ある列挙が他の列挙に基づくことができます。
列挙は、ソリューション パックの EnumertionTypes セクションで定義されています。 列挙の定義には、ルート列挙と、それに続く実際の列挙値が含まれます。
各 EnumerationValue は、いくつかの属性を持つことができます。
この例では、列挙は、プロジェクターの状態を追跡するために定義されています。 この列挙を定義しているものは、次のとおりです。
ID は、列挙の識別子または列挙の値です。
Accessibility は、この列挙子が他の列挙子を含むことができるかどうかを指定します。
ParentName は、列挙値の親の ID を指定する属性です。
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>
</EnumerationTypes>
フォームを作成する
Service Manager フォームは、Windows Presentation Framework (WPF) フォームに基づいています。 Service Manager は、XML 定義に追加される単純な属性を使用して WPF を拡張し、Service Manager が管理パックからフォームにデータをバインドできるようにします。
Service Manager フォームは、Microsoft Visual Studio や Microsoft Expression Blend など、いくつかの異なるツールを使用して作成できます。 フォームは XML ベースのため、どんな XML エディターを使用しても定義できます。
次の例は、Microsoft Expression Blend を使用して作成されたフォーム定義を示したものです。 このフォームには、4 つのコントロール、3 つのテキスト ボックス、1 つのコンボ ボックスが含まれ、それらは以前に定義された Projector クラスのプロパティにバインドされています。
<UserControl xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SMFormsDemo" x:Class="SMFormsDemo.TestControl" x:Name="Control" Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
<UserControl.Resources>
<ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>
<TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>
<Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>
<TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}"/>
<Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>
<TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>
<Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>
<TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}"/>
<Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
フォーム上のコントロールを、管理パックで定義されているクラスのプロパティにバインドできるようにするために、いくつかのアイテムを指定する必要があります。
テキスト コントロールのバインド
管理パックのクラス プロパティにテキスト ボックスをバインドするには、 Binding Path タグをテキスト ボックス コントロールの Text プロパティに追加します。次に例を示します。
{Binding Path=SerialNumber, Mode=TwoWay}
このタグは、テキスト ボックスを、管理パックで定義された Projector クラスの SerialNumber プロパティにバインドし、これが双方向バインドであることを指定します。 プロパティの値はデータベースから取得され、フォームが読み込まれるとテキスト ボックスに表示され、プロパティ値はユーザーによって変更された場合にデータベースに格納されます。
コンボ ボックスをバインドする
フォームがその基本である管理パックから列挙データを取得して、フォーム上のコントロールにバインドできるようにするには、フォームの code-behind でヘルパー クラスを定義する必要があります。 このヘルパー クラスには、管理パックで定義されている列挙を返すメソッドが含む必要があります。 列挙を返すには、現在の管理パックの GetEnumerations メソッドを使用します。 このインスタンスには、Service Manager ソフトウェア開発キット (SDK) の ConsoleContextHelper クラスを使用してアクセスします。 次の例では、ヘルパー クラスが、管理パックで定義されている GetStatusValues の値を取得する ProjectorCondition メソッドを定義します。
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
このメソッドにアクセスするには、管理パックのフォーム定義でいくつかを定義する必要があります。
まず、フォーム定義に、フォームの code behind の名前空間を参照する名前空間を追加します。 この例では、名前空間は SMFormsDemoです。
xmlns:local="clr-namespace:SMFormsDemo"
次に、プロジェクターの状態を表示するコンボ ボックスに値を提供する ObjectDataProvider を定義する必要があります。 この ObjectDataProvider は、リソースとして定義されています。
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
このデータ プロバイダーは、管理パックから列挙値を取得するオブジェクトとメソッドの名前を指定します。
最後に、コンボ ボックスを管理パックで定義されている列挙値にバインドするために、コンボ ボックスの定義に ItemsSource 属性を追加します。 この属性は、次の例のように、列挙値をどこから取得するのかを指定します。
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
次に、 SelectedItem 要素と ItemTemplate 要素を、コンボ ボックス コントロールの Extensible Application Markup Language (XAML) 定義に追加します。 次の例は、バインドする XAML が含まれるコンボ ボックス定義を示したものです。
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
[カテゴリ] セクション
管理パックの Category セクションは、より簡単に移動できるように、管理パック要素をグループに分けます。
この例の最初の 2 つの<Category>
要素は、Projectors ビューの New および Edit タスクの表示を制御するために使用されます。
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
管理パックの例の 2 つ目の 2 つの Category 要素は、Service Manager コンソールの Authoring ウィンドウの Lists ビューにプロジェクター条件列挙を表示するために使用されます。 これによって、ユーザーが値をカスタマイズできるようになります。
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
次の例では、このカテゴリを追加することで、 Target 属性で示されている EnumerationValue について、 [編集] タスクを [リスト] ビューに表示しています。
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
[プレゼンテーション] セクション
管理パックの Presentation セクションでは、ユーザー インターフェイスに関連する要素の宣言と定義を行います。 これには、フォームの宣言、カテゴリ、コンソール タスクが含まれます。
[フォーム] セクション
Forms セクションでは、管理パックによって使用されるフォームを宣言します。 次の例では、 Projector クラスのインスタンスの表示と編集を定義するフォームの場所が指定されています。 これによって、フォームが、管理パックで定義されている Projector クラスにバインドされます。
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
前の例では、次の属性が使用されています。
TypeName 属性は、フォームの名前空間とクラス名を含みます。
ID 属性は、このフォームのインスタンスの一意の識別子を含みます。
Target 属性は、このフォームがバインドされるクラスの名前を含みます。
Assembly 属性は、フォームが含まれる外部リソースを参照します。
Accessibility 属性は、このフォームがカスタマイズ可能かどうかを定義します。
ビューを定義する
管理パックの Views セクションには、ユーザー インターフェイス (UI) ビューの定義が含まれます。 これらのビューは、管理パックのオブジェクトのフィルター処理と表示に使用できます。
<View Target="System.ConfigItem.Projector"
Enabled="true"
TypeID="SMConsole!GridViewType"
ID="AllProjectorsView"
Accessibility="Public">
<Category>NotUsed</Category>
<Data>
<Adapters>
<Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter
</AdapterType>
</Adapter>
<Adapter AdapterName="viewframework://adapters/ListDefault">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>
</Adapter>
</Adapters>
<ItemsSource>
<AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000" treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >
<AdvancedListSupportClass.Parameters>
<QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>
</AdvancedListSupportClass.Parameters>
</AdvancedListSupportClass>
</ItemsSource>
<Criteria />
</Data>
<Presentation>
<Columns>
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">
<mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />
<mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />
<mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />
<mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />
<mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />
</mux:ColumnCollection>
</Columns>
</Presentation>
</View>
View Target 属性は、ビューの表示に使用されるクラスを参照します。
前の例では、Service Manager コンソール管理パックが参照されています。 この管理パックには、使用されるビューの種類の型が含まれています。 このインスタンスでは、 SMConsole!GridViewType ビューの型が定義されています。
AdvancedListSupportClass はいくつかのパラメーターを定義しますが、そのうち最も重要な TargetClass パラメーターを定義しています。 このパラメーターを、このビューで表示される ID の ClassType に設定します。 ClassTypeのプロパティを列に表示するには、 Column 要素を使用して、 PropertyID 属性にバインドします。
IsRecurring 要素の ListSupportClass 属性は、ビューが自動的に最新の情報に更新されるかどうかを決定します。 RecurrenceFrequency 属性は、更新間隔をミリ秒で定義します。 この例では、更新間隔は 1 秒に設定されていますが、運用環境のインストールには推奨されません。
フォルダーの定義
フォルダーの定義は、ビューに表示されるナビゲーション ツリーの場所を決定します。 この例では、構成項目は、 Configuration Items ワークスペース内の構成項目の既存のフォルダーの下にのみビューを配置するのに適するように定義されています。
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
前の例では、 ElementID 属性に、作成されたビューへの参照が含まれています。 Folder 属性は、Folders.Projectors フォルダーを指します。このフォルダーのルートは、Service Manager コンソールの Configuration Management ワークスペースで定義されています。 このルート フォルダーは、構成管理の管理パックで定義されています。
ImageReference 要素は、以前に作成されたビューを Configuration Management 名前空間で定義されているアイコンにマップします。
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
LanguagePacks セクションを使用したローカライズ
管理パックの LanaguagePacks セクションでは、管理パック要素の文字列リソースとマッピングを定義します。
この例では、 EnumerationValueProjectorCondition.Working は Working として表示する必要があります。 このためには、次のそれぞれに表示名を定義する必要があります。
ビュー:すべてのプロジェクト
列挙: Working、Broken、In Repair、New
<LanguagePacks>
<LanguagePack ID="ENU" IsDefault="true">
<DisplayStrings>
<DisplayString ElementID="AllProjectorsView">
<Name>All Projectors</Name>
<Description>This displays all projectors</Description>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Working">
<Name>Working</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Broken">
<Name>Broken</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.BeingRepaired">
<Name>In Repair</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.New">
<Name>New</Name>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
必要に応じて、各追加言語の追加 LanguagePack 要素を作成できます。 ユーザーのロケールに基づいて、正しい表示文字列がユーザーに表示されます。
リソース
管理パックの Resources セクションには、管理パックから独立したアセンブリに含まれるバイナリ リソースへの参照があります。 次の例では、 Projector クラスによって使用されるフォームを含むアセンブリを参照するリソースが定義されています。
<Assembly ID="ProjectorFormsAssembly"
Accessibility="Public"
QualifiedName="SMFormsDemo, Version=1.0.0.0" FileName="SMFormsDemo.dll" CreationDate="1900-10-12T13:13:13" ModifiedDate="2008-12-12T12:12:12" />
クラスの拡張
クラス拡張は、既存のクラスにプロパティを追加するクラスです。 ほとんどの場合、この既存クラスは封印された管理パックにあります。 既存のクラスが封印された管理パックに含まれていない場合、クラス拡張機能は、拡張されるクラスと同じ管理パックに含まれている必要があります。
クラス拡張は、親クラスのプロパティを継承します。次に例を示します。
クラス A には Property1 というプロパティがあります。
クラス B はクラス A から派生または拡張されるため、Property1 というプロパティを持ちます。 このプロパティは、クラス A (親または基本クラス) から継承されます。
クラス B の定義は、Property2 というプロパティを追加します。
クラス B から派生するクラス拡張はすべて、 Property1 と Property2 を継承します。
次の例は、クラス拡張の定義を示すものです。
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" IsExtensionType="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
このクラス拡張は、 System.WorkItem.Incident クラスを拡張し、 TimeOnIncidentと呼ばれる新しいプロパティを追加します。
クラス拡張の定義は、クラス定義に類似します。 クラス定義を定義するのに、 ClassType 要素の 2 つの属性である Base 属性と IsExtensionType 属性が使用されます。
Base 属性は、クラス拡張の派生元の親クラスの ID を指定します。 この場合、属性値は Incident!System.WorkItem.Incidentに設定されます。 この値には、拡張対象のクラスを含む完全な管理パック名の Alias 、感嘆符、基本クラスの名前が含まれます。 詳細については、次の例を参照してください。
IsExtensionType 属性は、このクラスが基本クラスの拡張であるかどうかを定義します。 TimeOnIncident は Incident クラスの拡張であるため、このプロパティは trueに設定されます。
IsExtensionType="true"
もう 1 つのオプションは false です。これは、それが別のクラスの拡張ではなく、基本から継承する新しいクラスであることを示します。 既定値は false です。したがって、クラスが拡張機能でない場合は、この属性を使用する必要はありません。
完全な例
次のコード例は、クラス拡張を含む完全な管理パックを示しています。
ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="1.1">
<Manifest>
<Identity>
<ID>ServiceManager.Extension</ID>
<Version>1.0.0.0</Version>
</Identity>
<Name>ServiceManagerExtension</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Incident">
<ID>System.WorkItem.Incident.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" Extension="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
</ManagementPack>
コマンドレットを使用して管理パックをインポートする
Windows PowerShell Import-SCSMManagementPack コマンドレットを使用して、Service Manager 管理パックをインポートできます。次に例を示します。
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
このドキュメントでは、Service Manager コンソールで管理パックをインポートして使用する方法については説明しません。 Service Manager コンソールでの管理パックの使用については、「 Service Manager での管理パックの使用」を参照してください。
完全管理パックの例
次のコード例は、フォーム定義とフォームの C# 分離コードに加えて、この記事の例で使用される完全なサンプル管理パックを表しています。
管理パック
<ManagementPack ContentReadable="true" SchemaVersion="1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<Manifest>
<Identity>
<ID>ServiceManager.Projector</ID>
<Version>7.0.3707.0</Version>
</Identity>
<Name>Projector Library</Name>
<References>
<Reference Alias="SMConsole">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Authoring">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConfig">
<ID>ServiceManager.ConfigurationManagement.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="System.ConfigItem.Projector" Accessibility="Public" Abstract="false" Base="System!System.ConfigItem" Hosted="false" Singleton="false" Extension="false">
<Property ID="SerialNumber" Type="int" Key="true" />
<Property ID="Make" Type="string" />
<Property ID="Model" Type="string" />
<Property ID="Location" Type="string" />
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />
</ClassType>
</ClassTypes>
<EnumerationTypes>
<EnumerationValue ID="ProjectorCondition" Accessibility="Public" />
<EnumerationValue ID="ProjectorCondition.Working" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.BeingRepaired" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.New" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorCondition.Broken" Accessibility="Public" Parent="ProjectorCondition" />
<EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public" />
</EnumerationTypes>
</EntityTypes>
</TypeDefinitions>
<Categories>
<Category ID="AllProjectorsView.Category" Target="AllProjectorsView" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ViewTasks" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="AllProjectorsView" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.CreateTypeCategory" />
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks" />
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser" />
</Categories>
<Presentation>
<Forms>
<Form ID="TestForm" Accessibility="Public" Target="System.ConfigItem.Projector" Assembly="ProjectorFormsAssembly" TypeName="New_CI_lab.TestControl">
<Category>Form</Category>
</Form>
</Forms>
<Views>
<View ID="AllProjectorsView" Accessibility="Public" Enabled="true" Target="System.ConfigItem.Projector" TypeID="SMConsole!GridViewType" Visible="true">
<Category>NotUsed</Category>
<Data>
<Adapters>
<Adapter AdapterName="dataportal:EnterpriseManagementObjectAdapter">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter</AdapterType>
</Adapter>
<Adapter AdapterName="viewframework://adapters/AdvancedList">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>
</Adapter>
<Adapter AdapterName="omsdk://Adapters/Criteria">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>
</Adapter>
</Adapters>
<ItemsSource>
<AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup"
IsRecurring="true" RecurrenceFrequency="5000" Streaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >
<AdvancedListSupportClass.Parameters>
<QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>
</AdvancedListSupportClass.Parameters>
</AdvancedListSupportClass>
</ItemsSource>
<Criteria />
</Data>
<Presentation>
<Columns>
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">
<mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />
<mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />
<mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />
<mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />
<mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />
</mux:ColumnCollection>
</Columns>
</Presentation>
</View>
</Views>
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem ElementID="AllProjectorsView" ID="FolderItem.AllProjectors" Folder="Folder.Projectors" />
</FolderItems>
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
</Presentation>
<LanguagePacks>
<LanguagePack ID="ENU" IsDefault="true">
<DisplayStrings>
<DisplayString ElementID="System.ConfigItem.Projector">
<Name>Projector</Name>
</DisplayString>
<DisplayString ElementID="Folder.Projectors">
<Name>Projectors</Name>
<Description>This is the Projector Folder</Description>
</DisplayString>
<DisplayString ElementID="AllProjectorsView">
<Name>All Projectors</Name>
<Description>This displays all projectors</Description>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Working">
<Name>Working</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Broken">
<Name>Broken</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.BeingRepaired">
<Name>In Repair</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.New">
<Name>New</Name>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
<Resources>
<Assembly ID="ProjectorFormsAssembly" Accessibility="Public" FileName="New_CI_lab.dll" QualifiedName="New_CI_lab, Version=0.0.0.0" />
</Resources>
</ManagementPack>
フォーム定義
<UserControl
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SMFormsDemo"
x:Class="SMFormsDemo.TestControl"
x:Name="Control"
Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
<UserControl.Resources>
<ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>
<TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>
<Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>
<TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}" />
<Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>
<TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>
<Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>
<TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}" />
<Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>
<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">
<ComboBox.SelectedItem>
<Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
</ComboBox.SelectedItem>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=DisplayName}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
</UserControl>
フォームの分離コード
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Threading;
using System.Windows.Controls;
using Microsoft.EnterpriseManagement.ServiceManager.Application.Common;
using Microsoft.EnterpriseManagement.UI.DataModel;
namespace SMFormsDemo
{
/// <summary>
/// Interaction logic for ProjectorForm.xaml
/// </summary>
public partial class TestControl : UserControl
{
public TestControl()
{
InitializeComponent();
}
}
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
}