Trabalhar com ficheiros XML do pacote de gestão Service Manager
Importante
Esta versão do Service Manager chegou ao fim do suporte. Recomendamos que atualize para o Service Manager 2022.
Para personalizações elaboradas de pacotes de gestão, a consola do Service Manager e a Ferramenta de Criação do Service Manager poderão não ser suficientes e poderá ter de criar ou modificar ficheiros de pacote de gestão diretamente. Trabalhar diretamente com ficheiros de pacotes de gestão requer conhecimentos aprofundados em várias áreas, como o Esquema Comum do System Center e a estrutura dos pacotes de gestão.
Esta secção fornece informações e diretrizes em segundo plano que podem ajudá-lo a criar e modificar pacotes de gestão para personalizar Service Manager.
Alterações ao Esquema Comum do System Center
Service Manager inclui uma versão atualizada do Esquema do Pacote de Gestão do System Center. Este esquema é agora denominado Esquema Comum do System Center e inclui uma série de melhoramentos e adições que se destinam a melhorar a funcionalidade existente e ativar funcionalidades de Service Manager. Este artigo descreve as alterações ao Esquema Comum do System Center.
Restrições de propriedades e propriedades
O esquema comum expande classes através de vários novos tipos de propriedade. Estes tipos de propriedade incluem os tipos binários, enumeradores e incrementos automáticos.
Além disso, pode definir restrições em determinados valores de propriedades. Por exemplo, pode definir uma restrição para uma expressão regular relativa a um valor de propriedade de cadeia. No exemplo seguinte, a propriedade BuildingName tem uma restrição de expressão regular que é definida para que apenas um valor que contenha a palavra Edifício seguido de um espaço e um número seja considerado válido.
<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>
Imagens
As imagens não são armazenadas dentro de um pacote de gestão. Assim, a secção <PresentationTypes>
do pacote de gestão já não contém as etiquetas <Images>
, <Image>
ou <ImageData>
. Em vez disso, utilize um recurso de imagem.
<Resources>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
Enumerações
O esquema comum suporta enumerações. As enumerações são uma árvore de valores que pode utilizar para restringir o valor de uma propriedade ou atributo.
Cada enumeração tem um atributo de ID exclusivo necessário e um atributo Principal opcional.
No exemplo seguinte, a enumeração XBoxState é definida com três valores possíveis: Em Execução, Parado e Erro.
<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>
No exemplo seguinte, a classe Xbox define uma propriedade de enumeração do tipo 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>
Relações
A funcionalidade de definições de relação foi melhorada no esquema comum. O tipo RelationshipType tem agora subelementos Origem e Destino com propriedades de ID que podem ser utilizadas como nomes a apresentar. Além disso, pode definir a cardinalidade mínima e máxima para a origem e o destino; por exemplo, relações de 1 para 1 ou 0 para muitos.
A cardinalidade não é imposta pelo processo de validação do pacote de gestão, mas destina-se a ajudar a definir interfaces de utilizador para o pacote de gestão. Por exemplo, a cardinalidade pode ser verificada para determinar se um campo pode ser representado num formulário por uma caixa de texto ou por uma lista.
Importante
Qualquer valor MaxCardinality definido como superior a 1 é processado como ilimitado.
Se adicionar um novo tipo de relação a partir do seu pacote de gestão, os utilizadores têm de ter privilégios suficientes para atualizar todas as propriedades das instâncias de classe de origem e de destino do tipo de relação para criarem uma instância do novo tipo de relação.
No exemplo seguinte, é definida uma relação de alojamento denominada HasXboxes entre o tipo lobby e o tipo Xbox . Nesta definição de relação, cada tipo de Lobby pode ter vários tipos de 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>
Classes de combinação
As classes de combinação representam uma agregação de vários tipos relacionados no pacote de gestão, semelhante às vistas definidas numa base de dados do Microsoft SQL Server que pode devolver dados de várias tabelas. As classes de combinação armazenam e obtêm todos os dados agregados numa operação na base de dados e podem facilitar a definição de interfaces de utilizador para um pacote de gestão.
No exemplo seguinte, está definida uma projeção para uma vista de gestão de incidentes. Esta projeção combina vários componentes diferentes que estão relacionados com um incidente numa unidade que pode ser usada mais facilmente para formulários e operações da base de dados.
<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>
Tarefas da consola
As tarefas da consola são expandidas no esquema comum. Anteriormente, as tarefas da consola eram simples ponteiros para um diretório de aplicações e o nome de um ficheiro executável. As tarefas da consola são agora implementadas como código de processador numa assemblagem do Microsoft .NET Framework. O código de processamento referencia a assemblagem que aloja o código, o nome do processador e uma lista de valores nomeados que podem ser transmitidos como argumentos ao processador.
No exemplo seguinte, o processador Some.Handler.Name é definido na assemblagem MyLibrary.Resources.Assembly . Também é definida uma lista de parâmetros do processador e os valores correspondentes.
<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>
Recursos
Os dados binários não são armazenados diretamente num pacote de gestão. Em vez disso, os metadados sobre o recurso binário são armazenados no pacote de gestão e os dados binários reais são armazenados externamente num ficheiro de recurso. Os metadados incluem um identificador exclusivo, o nome do ficheiro, os dados de criação, a data de modificação e informações de acessibilidade.
Os dados binários podem incluir recursos genéricos, imagens, assemblagens, definições de relatório e formulários. O exemplo seguinte mostra um recurso XML genérico, um recurso de assemblagem e um recurso de relatório.
<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>
Formulários
Os formulários são definidos num pacote de gestão. Pode utilizar formulários para visualizar e modificar uma única instância de uma classe de tipo ou de uma combinação.
Os formulários baseiam-se no Windows Presentation Framework (WPF) e são definidos em assemblagens. A assemblagem e a classe que contêm as implementações de formulário para um pacote de gestão estão incluídas na secção de recursos do pacote de gestão. Tal como acontece com qualquer recurso binário num pacote de gestão que utiliza o novo esquema comum, o próprio pacote de gestão não contém os dados binários do formulário. Apenas o manifesto do recurso é especificado no pacote de gestão.
Pode especificar as suas informações de configuração para o formulário no pacote de gestão. No exemplo seguinte, a secção Configuração contém uma propriedade ShowXboxes . Estas informações de configuração não são avaliadas pelo processo de verificação do pacote de gestão; só é interpretado pela implementação do formulário.
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
Criar um ficheiro de pacote de gestão para gerir projetores
Os pacotes de gestão são utilizados para direcionar e expandir a funcionalidade de Service Manager. Este artigo utiliza projetores como exemplo para descrever as várias secções de um pacote de gestão e para definir os vários objetos necessários para gerir projetores numa organização.
Este artigo inclui um exemplo completo de pacote de gestão com as extensões necessárias para gerir projetores numa organização. Além disso, descreve como importar um pacote de gestão com um cmdlet Windows PowerShell.
Este artigo descreve as seguintes secções de um pacote de gestão:
O Manifesto
TypeDefinitions para criar enumerações de classes e relações
Formulários
Este artigo também descreve as secções seguintes de um pacote de gestão que contém declarações e definições para interface de utilizador (IU) e elementos de localização:
Categorias
Apresentação
Extensões de Classe
Secção manifesto
A primeira secção de um pacote de gestão contém o manifesto. O manifesto identifica o pacote de gestão e declara quaisquer referências a outros pacotes de gestão.
O exemplo seguinte mostra a secção Manifesto de um pacote de gestão que foi concebido para controlar projetores numa organização.
<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>
Importante
Na secção Referências , não utilize valores não fantasmagómicos, como ".", no Alias para uma referência.
Criar classes na secção TypeDefinitions
A secção seguinte de um pacote de gestão contém definições de tipos. A secção TypeDefinitions de um pacote de gestão contém definições para classes, enumerações e relações que são utilizadas pelo pacote de gestão.
O seguinte exemplo mostra uma classe que contém informações sobre projetores:
<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>
Segue-se uma explicação secção a secção do que a definição de tipo contém.
A secção ClassTypes
O elemento ClassType define a classe projetor:
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
O atributo ID é o identificador exclusivo desta classe. Está definido como:
ID="System.ConfigItem.Projector"
O atributo Base é o ID da classe a partir da qual esta classe deriva. Uma vez que um projetor é um tipo de item de configuração, é definido como:
Base="System!System.ConfigItem"
A notação do Sistema! indica que esta classe, System.ConfigItem, está no pacote de gestão que é referenciado pelo sistema de alias.
O atributo Alojado define se esta classe está alojada por outra classe. Neste caso, uma instância desta classe só pode existir se for alojada por uma instância de anfitrião. Neste exemplo, os projetores não são alojados por nada; Por conseguinte, o atributo Alojado está definido como falso:
Hosted="false"
Definir o atributo Alojado como verdadeiro indica que a classe está alojada por outra classe. Uma relação de alojamento tem de ser declarada na secção RelationshipTypes .
O atributo Acessibilidade define se outras classes podem derivar desta classe. Nos casos em que poderá querer permitir que outras pessoas criem uma versão mais específica da sua turma, defina este atributo como público, por exemplo:
Accessibility="Public"
Definir o atributo Acessibilidade como Interno impede outras classes de derivarem desta classe.
O atributo Abstrato define se as instâncias desta classe podem ser criadas ou se a classe deve ser apenas utilizada como uma classe principal para outras classes para derivar. Neste exemplo, este atributo está definido como falso. Definir este atributo como verdadeiro significa que nenhuma instância desta classe pode ser criada diretamente e que esta classe só pode ser utilizada como uma classe principal.
A secção seguinte da definição de classe contém as propriedades de classe. O XML que define as propriedades de classe para este exemplo é definido no seguinte exemplo de código:
<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" />
Cada elemento Propriedade tem os seguintes atributos:
O atributo ID , que designa o identificador exclusivo da propriedade.
O atributo Tipo , que indica o tipo de dados da propriedade.
O atributo Chave . Definir este atributo como verdadeiro indica que esta propriedade deve ser utilizada para identificar exclusivamente esta classe.
Criar Tipos de Enumeração
As enumerações do tipo de dados de numeração são tipos de dados especiais. As enumerações são utilizadas para restringir a um conjunto específico de valores os dados que são permitidos para uma propriedade. As enumerações podem ser hierárquicas; uma enumeração pode basear-se noutra enumeração.
As enumerações são definidas na secção EnumertionTypes de um pacote de soluções. Uma definição de enumeração contém a enumeração raiz, seguida dos valores da enumeração.
Cada EnumerationValue aceita alguns atributos:
Neste exemplo, uma enumeração está definida para controlar a condição dos projetores. As indicações seguintes definem esta enumeração:
O ID é o identificador do valor de enumeração ou enumeração.
A acessibilidade especifica se este enumerador pode conter outros enumeradores.
ParentName é um atributo que especifica o ID do principal do valor do enumerador.
<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>
Criar um formulário
Service Manager formulários são baseados em formulários do Windows Presentation Framework (WPF). Service Manager expande o WPF com atributos simples que são adicionados à definição XML e permitem Service Manager vincular dados do pacote de gestão ao formulário.
Service Manager formulários podem ser criados com várias ferramentas diferentes, incluindo o Microsoft Visual Studio ou o Microsoft Expression Blend. Uma vez que os formulários são baseados em XML, também podem ser definidos através de qualquer editor XML.
O seguinte exemplo mostra uma definição de formulário que foi criada com o Microsoft Expression Blend. Este formulário contém quatro controlos, três caixas de texto e uma caixa de combinação, vinculados às propriedades da classe Projetor que foram definidas anteriormente:
<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>
Para permitir o vínculo de controlos no formulário a propriedades de classe definidas num pacote de gestão, tem de especificar uma série de itens.
Controlos de Texto de Enlace
Para vincular caixas de texto a propriedades de classe num pacote de gestão, adicione uma etiqueta Caminho de Enlace à propriedade Texto do controlo de caixa de texto, por exemplo:
{Binding Path=SerialNumber, Mode=TwoWay}
Esta etiqueta vincula o controlo da caixa de texto à propriedade SerialNumber da classe Projetor que foi definida no pacote de gestão e especifica que este deve ser um enlace bidirecional. O valor da propriedade é obtido da base de dados e apresentado na caixa de texto quando o formulário é carregado e o valor da propriedade é armazenado novamente na base de dados se for alterado pelo utilizador.
Caixas de Combinação de Enlace
Para permitir que o formulário obtenha dados de enumeração do pacote de gestão subjacente e os vinculte a um controlo no formulário, tem de ser definida uma classe auxiliar no código subjacente no formulário. Esta classe de programa auxiliar deve conter um método que devolva uma enumeração que é definida no pacote de gestão. Para devolver uma enumeração, utilize o método GetEnumerations do pacote de gestão atual. Esta instância é acedida com a classe ConsoleContextHelper a partir do Service Manager software development kit (SDK). No exemplo seguinte, uma classe auxiliar define um método GetStatusValues que obtém os valores da enumeração ProjetorCondition que foi definida no pacote de gestão:
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
Para aceder a este método, tem de definir algumas coisas na definição do formulário no pacote de gestão.
Em primeiro lugar, um espaço de nomes que aponte para o espaço de nomes para o código subjacente ao formulário é adicionado à definição do formulário. Neste exemplo, o espaço de nomes é SMFormsDemo:
xmlns:local="clr-namespace:SMFormsDemo"
Em seguida, tem de ser definido um ObjectDataProvider para fornecer os valores da caixa de combinação que apresenta o estado do projetor. Este ObjectDataProvider é definido como um recurso:
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
Este fornecedor de dados especifica o nome do objeto e do método que obtém os valores de enumeração no pacote de gestão.
Por fim, para vincular a caixa de combinação aos valores de enumeração definidos no pacote de gestão, é adicionado um atributo ItemsSource à definição da caixa de combinação. Este atributo especifica onde obter os valores de enumeração, por exemplo:
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
Em seguida, os elementos SelectedItem e ItemTemplate são adicionados à definição de Linguagem de Marcação de Aplicação Extensível (XAML) do controlo da caixa de combinação. O seguinte exemplo mostra a definição da caixa de combinação com o XAML de vínculo incluído:
<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>
A secção Categoria
A secção Categoria de um pacote de gestão agrupa elementos do pacote de gestão para facilitar a navegação.
Os dois <Category>
primeiros elementos no exemplo são utilizados para controlar a apresentação das tarefas Novo e Editar na vista Projetores .
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
Os dois elementos de Categoria no pacote de gestão de exemplo são utilizados para fazer com que a enumeração da condição do projetor apareça na vista Listas no painel Criação na consola do Service Manager. Deste modo, o utilizador pode personalizar os valores:
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
Adicionar esta categoria no exemplo seguinte faz com que a tarefa Editar apareça na vista de Listas para EnumerationValue que é apontada no atributo Destino:
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
A secção Apresentação
A secção Apresentação de um pacote de gestão declara e define elementos relacionados com a interface de utilizador. Estes incluem declarações de formulários, categorias e tarefas da consola.
A secção Formulários
A secção Formulários declara formulários que são utilizados pelo seu pacote de gestão. O exemplo seguinte especifica onde encontrar o formulário definido para apresentar e editar instâncias da classe Projetor . Esta ação vincula o formulário à classe Projetor definida no pacote de gestão:
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
Os seguintes atributos são utilizados no exemplo anterior:
O atributo TypeName contém o espaço de nomes e o nome da classe do formulário.
O atributo ID contém o identificador exclusivo desta instância de formulário.
O atributo Destino contém o nome da classe à qual este formulário está vinculado.
O atributo Assemblagem aponta para o recurso externo que contém o formulário.
O atributo Acessibilidade define se este formulário pode ser personalizado.
Definir uma Vista
A secção Vistas de um pacote de gestão contém definições de vistas de interface de utilizador (IU). Estas vistas podem ser utilizadas para filtrar e apresentar objetos num pacote de gestão.
<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>
O atributo View Target aponta para a classe que vai ser utilizada para apresentar a vista.
No exemplo anterior, o pacote de gestão da Consola do Service Manager é referenciado. Este pacote de gestão contém uma definição de um tipo de vista que está a ser utilizado. Neste caso, o SMConsole! O tipo de vista GridViewType está definido.
AdvancedListSupportClass define um número de parâmetros, o mais importante dos quais é o parâmetro TargetClass. Defina este parâmetro para o ID do ClassType que será apresentado nesta vista. Para apresentar as colunas que são propriedades do ClassType, utilize o elemento Coluna e vinculte-o ao atributo PropertyID .
O atributo IsRecurring do elemento ListSupportClass determina se a vista é atualizada automaticamente. O atributo RecurrenceFrequency define o intervalo de atualização em milissegundos. Neste exemplo, o intervalo de atualização está definido como 1 segundo, mas não é recomendado para instalações de produção.
Definir Pastas
Definir uma pasta determina a localização na árvore de navegação em que a vista é apresentada. Neste exemplo, é definido um item de configuração para que só seja adequado colocar a vista na pasta existente para itens de configuração na área de trabalho Itens de Configuração :
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
No exemplo anterior, o atributo ElementID contém uma referência à vista que foi criada. O atributo Pasta aponta para uma pasta Folders.Projetors, que por sua vez tem a sua raiz, conforme definido na área de trabalho Gestão de Configuração da consola Service Manager. Esta pasta raiz é definida no pacote de gestão Gestão de Configurações.
O elemento ImageReference mapeia a vista que foi criada anteriormente para um ícone definido no espaço de nomes Gestão de Configuração :
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
Localização Utilizando a Secção LanguagePacks
A secção LanaguagePacks de um pacote de gestão define recursos de cadeia e mapeamentos para elementos do pacote de gestão.
No exemplo, EnumerationValueProjectorCondition.Working tem de aparecer como A Trabalhar. Para tal, têm de ser definidos nomes a apresentar para cada um dos seguintes elementos:
Ver: Todos os projetores
Enumerações: a funcionar, quebradas, em reparação, novas
<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>
Pode criar elementos LanguagePack adicionais, conforme necessário, para cada idioma adicional necessário. A cadeia de apresentação correta é apresentada ao utilizador com base na região do utilizador.
Recursos
A secção Recursos de um pacote de gestão contém referências a recursos binários, que estão contidos em assemblagens separadas do pacote de gestão. No exemplo seguinte, é definido um recurso que aponta para a assemblagem que contém o formulário que é utilizado pela classe Projetor :
<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" />
Extensões de classe
Uma extensão de classe é uma classe que adiciona propriedades a uma classe existente. Na maioria dos casos, esta classe existente encontra-se num pacote de gestão selado. Nos casos em que a classe existente não está num pacote de gestão selado, a extensão de classe tem de estar contida no mesmo pacote de gestão que a classe que está a ser expandida.
Uma extensão de classe herda as propriedades de quaisquer classes principais, por exemplo:
A classe A tem uma propriedade denominada Property1
A Classe B deriva, ou expande-se, da Classe A e, por isso, tem uma propriedade denominada Property1. Esta propriedade é herdada da Classe A, da classe principal ou da classe base)
A definição da Classe B adiciona uma propriedade denominada Property2.
Qualquer extensão de classe que derive da Classe B irá herdar Property1 e Property2.
O exemplo seguinte mostra uma definição de extensão de classe:
<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>
Esta extensão de classe expande a classe System.WorkItem.Incident e adiciona uma nova propriedade denominada TimeOnIncident.
A definição de uma extensão de classe é semelhante à de uma definição de classe. São utilizados dois atributos do elemento ClassType para definir uma definição de classe: o atributo Base e o atributo IsExtensionType .
O atributo Base especifica o ID da classe principal a partir da qual a extensão de classe deriva. Neste caso, o valor do atributo está definido como Incidente! System.WorkItem.Incident. Este valor contém o Alias do nome completo do pacote de gestão, que contém a classe que está a ser expandida, um ponto de exclamação e, em seguida, o nome da classe base. Para obter mais informações, consulte o exemplo seguinte.
O atributo IsExtensionType define se esta classe é uma extensão da classe base. Uma vez que TimeOnIncident é uma extensão da classe Incidente , esta propriedade está definida como verdadeira:
IsExtensionType="true"
A outra opção é falso, o que indica que não é uma extensão de outra classe, mas sim uma nova classe que herda da base. O valor predefinido é falso; Por conseguinte, este atributo não tem de ser utilizado se a classe não for uma extensão.
Exemplo Completo
O exemplo de código seguinte mostra o pacote de gestão completo com a extensão de classe.
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>
Importar um pacote de gestão com um cmdlet
Pode utilizar o cmdlet Import-SCSMManagementPack Windows PowerShell para importar um pacote de gestão Service Manager, por exemplo:
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
Este documento não descreve como importar e utilizar pacotes de gestão na consola do Service Manager. Para obter informações sobre como utilizar pacotes de gestão na consola do Service Manager, consulte Utilizar Pacotes de Gestão no Service Manager.
Exemplo completo do pacote de gestão
Os exemplos de código seguintes representam o pacote de gestão de exemplo completo que é utilizado para exemplos neste artigo, além da definição de formulário e do código C# subjacente ao formulário.
Pacote de Gestão
<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>
Definição de Formulário
<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>
Código de Formulário Atrasado
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);
}
}
}