使用 Service Manager 管理元件 XML 檔案
如需管理元件的詳細自定義,Service Manager 控制台和 Service Manager 撰寫工具可能不足,您可能需要直接撰寫或修改管理元件檔案。 直接使用管理元件檔案需要數個領域的深入知識,例如 System Center 通用架構和管理元件的結構。
本節提供背景資訊和指導方針,可協助您撰寫和修改管理元件來自定義 Service Manager。
System Center 一般架構的變更
Service Manager 包含 System Center 管理元件架構的更新版本。 此架構現在稱為 System Center 通用架構,其中包含一些改善和新增功能,旨在增強現有的功能並啟用 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。
<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 值,系統均會將其視為無限制並加以處理。
如果您從管理組件新增關聯性類型,使用者必須具有足夠的權限來更新關聯性類型之來源和目標類別執行個體的所有內容,才能建立新關聯性類型的執行個體。
在下列範例中,定義「大廳類型」與 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 資料庫中定義且能傳回多個資料表之資料的檢視相似。 組合類別能在一次資料庫作業中儲存及擷取所有彙總資料,也能簡化管理組件之使用者介面的定義作業。
以下範例能定義事件管理檢視的投影。 此投影能將數種與事件相關的相異元件組合成一個單位,簡化表單和資料庫作業的複雜度。
<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) 為基礎,而且定義於元件中。 包含管理組件之表單實作的組件和類別收編於管理組件的資源區段中。 如同使用新通用架構之管理元件中的任何二進位資源,管理元件本身不會包含表單的二進位數據。 管理組件中只包含已指定的資源資訊清單。
您可以在管理組件中指定自己的表單設定資訊。 在下列範例中,Configuration 區段包含 ShowXboxes 內容。 管理元件驗證程式不會評估此組態資訊;它只會由窗體實作解譯。
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
撰寫管理元件檔案以管理投影機
管理元件可用來引導和擴充 Service Manager 的功能。 本文使用投影機作為描述管理元件各區段的範例,以及定義管理組織中投影機所需的各種物件。
本文包含完整的管理元件範例,其中包含管理組織中投影機所需的擴充功能。 此外,本主題也說明如何使用 Windows PowerShell Cmdlet 匯入管理組件。
本文說明管理元件的下列各節:
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>
重要
在 [參考] 區段中,請勿在參考的別名中使用非虛構值,例如 '.'。
在 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 屬性是此類別衍生來源類別的唯一識別碼。 因為投影機是一種設定項目,所以此屬性設定為:
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 窗體可以使用數種不同的工具來建立,包括 Visual Studio Microsoft 或 Microsoft Expression Blend。 由於這些表單是 XML 格式,因此也可以使用任何 XML 編輯器來定義。
下列範例顯示使用 Microsoft Expression Blend 建立的表單定義。 這個表單包含四個控制項 (三個文字方塊和一個下拉式方塊),繫結至先前定義的 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>
若要讓表單上的控制項繫結到管理組件中定義的類別內容,必須指定幾個項目。
系結文字控件
若要將文字框系結至管理元件中的類別屬性,請將系結路徑標籤新增至文本框控件的 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 元件會新增到下拉式方塊控制項的可延伸應用程式標記語言 (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 區段會將管理組件元素群組在一起,以方便瀏覽。
範例中的前兩<Category>
個專案是用來控制投影機檢視中 [新增] 和 [編輯] 工作的顯示。
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
範例管理元件中的第二個 Category 元素可用來使投影機條件列舉出現在 Service Manager 控制台的 [撰寫] 窗格中的 [列表] 檢視中。 這可讓使用者自訂值:
<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 區段
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>
[檢視目標] 屬性指向要使用檢視顯示的類別。
前面的範例中參照了 Service Manager 主控台管理組件。 這個管理組件包含所用檢視類型的定義。 本例中定義的是 SMConsole!GridViewType 檢視類型。
AdvancedListSupportClass 定義幾個參數,其中最重要的是 TargetClass 參數。 請將此參數設定為將會出現在此檢視之 ID 的 ClassType 。 若要顯示 ClassType之內容的各欄,請使用 Column 元素,並將它繫結到 PropertyID 屬性。
IsRecurring 元素的 ListSupportClass 屬性決定檢視是否會自動重新整理。 RecurrenceFrequency 屬性定義以毫秒為單位的重新整理間隔。 在此範例中,重新整理間隔設定為1秒,但不建議用於生產安裝。
定義資料夾
定義資料夾可決定檢視在導覽樹狀結構中的顯示位置。 在此範例中,會定義組態專案,使其只適合將檢視放在 [組態專案] 工作區中組態專案的現有資料夾下:
<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。 為了達到此目的,必須定義以下每個元素的顯示名稱:
檢視:所有投影機
列舉:工作中、中斷、修復中、新增
<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 元素的兩個屬性來定義類別定義: Base 屬性和 IsExtensionType 屬性。
Base 屬性能指定類別延伸衍生之來源父類別的 ID 。 在本例中,屬性值已設定為 Incident!System.WorkItem.Incident。 此值包含完整管理組件名稱的 Alias ,其中包含要擴充的類別、驚嘆號及基底類別的名稱。 如需詳細資訊,請參閱下列範例。
IsExtensionType 屬性會定義此類別是否為基底類別的延伸。 由於 TimeOnIncident 是 Incident 類別的延伸,因此該內容設定為 true:
IsExtensionType="true"
另一個選項為 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>
使用 Cmdlet 匯入管理元件
您可以使用 Windows PowerShell Import-SCSMManagementPack Cmdlet 匯入 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);
}
}
}