Usare i file XML del Management Pack di Service Manager
Per le personalizzazioni elaborate dei Management Pack, la console di Service Manager e lo strumento di creazione di Service Manager potrebbero non essere sufficienti e potrebbe essere necessario creare o modificare direttamente i file del Management Pack. L'uso diretto dei file del Management Pack richiede conoscenze approfondite in diverse aree, ad esempio System Center Common Schema e la struttura dei Management Pack.
In questa sezione vengono fornite informazioni e linee guida generali che consentono di creare e modificare i Management Pack per personalizzare Service Manager.
Modifiche allo schema comune di System Center
Service Manager include una versione aggiornata dello schema del Management Pack di System Center. Questo schema è ora denominato System Center Common Schema e include numerosi miglioramenti e aggiunte destinati a migliorare le funzionalità esistenti e abilitare le funzionalità di Service Manager. Questo articolo descrive le modifiche apportate allo schema comune di System Center.
Proprietà e restrizioni delle proprietà
Lo schema comune estende le classi attraverso diversi nuovi tipi di proprietà. Questi tipi di proprietà includono i tipi binari, enumeratori e incrementi automatici.
Inoltre è possibile definire restrizioni per alcuni valori di proprietà. Ad esempio, è possibile definire una restrizione per l'espressione regolare su un valore di proprietà stringa. Nell'esempio seguente la proprietà BuildingName ha una restrizione dell'espressione regolare definita in modo che solo un valore contenente la parola Building seguito da uno spazio e un numero sia considerato valido.
<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>
Immagini
Le immagini non vengono archiviate all'interno di un Management Pack. Pertanto, la <PresentationTypes>
sezione del Management Pack non contiene più i <Images>
tag , <Image>
o <ImageData>
. Sostituire con una risorsa immagine.
<Resources>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
Enumerazioni
Lo schema comune supporta le enumerazioni. Le enumerazioni sono una struttura ad albero di valori che consente di limitare il valore di una proprietà o di un attributo.
Ciascuna enumerazione dispone un attributo ID univoco richiesto e di un attributo Parent opzionale.
Nell'esempio seguente, l'enumerazione XBoxState viene definita con tre possibili valori: In esecuzione, Interrotto ed Errore.
<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>
Nell'esempio seguente, la classe Xbox definisce una proprietà enum di 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>
Relazioni
Nello schema comune è stata migliorata la funzionalità delle definizioni delle relazioni. Adesso il tipo RelationshipType dispone dei sottoelementi Source e Target con proprietà ID che è possibile utilizzare come nomi visualizzati. Inoltre, è possibile definire la cardinalità minima e massima sia per l'origine che per la destinazione; ad esempio relazioni da 1 a 1 o da 0 a molti.
La cardinalità non viene applicata dal processo di convalida del Management Pack, ma è destinata a definire le interfacce utente per il Management Pack. Ad esempio, è possibile verificare la cardinalità in modo da stabilire se sia possibile rappresentare il campo di un modulo attraverso una casella di testo o un elenco.
Importante
Qualsiasi valore di MaxCardinality definito come maggiore di 1 verrà elaborato come infinito.
Se si aggiunge un nuovo tipo di relazione dal proprio Management Pack, per creare un'istanza del nuovo tipo di relazione è necessario disporre di privilegi sufficienti per aggiornare tutte le proprietà delle istanze delle classi di origine e di destinazione del tipo di relazione.
Nell'esempio seguente viene definita una relazione di hosting denominata HasXboxes tra il tipo Lobby e il tipo Xbox. Nella definizione della relazione, ciascun tipo Lobby può disporre di più tipi 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>
Classi combinate
Le classi combinate sono un'aggregazione di più tipi correlati nel Management Pack, simili alle viste definite in un database Microsoft SQL Server in grado di restituire dati da più tabelle. Le classi combinate consentono di archiviare e recuperare tutti i dati aggregati in una singola operazione eseguita sul database e agevolano la definizione delle interfacce utente di un Management Pack.
Nell'esempio seguente viene definita una proiezione per una vista di gestione degli eventi imprevisti. La proiezione unisce diversi componenti, legati a un evento imprevisto, a una singola unità che è possibile utilizzare più agevolmente per moduli e operazioni di database.
<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>
Attività della console
Le attività della console vengono estese nello schema comune. In precedenza, le attività della console erano semplici puntatori a una directory delle applicazioni e al nome di un file eseguibile. Adesso le attività della console vengono implementate come codice del gestore in un assembly di Microsoft.NET Framework. Il codice del gestore fa riferimento all'assembly che ospita il codice, al nome del gestore e a un elenco di valori che è possibile trasmettere al gestore come argomenti.
Nel seguente esempio, il gestore Some.Handler.Name viene definito nell'assembly MyLibrary.Resources.Assembly . Viene definito anche un elenco dei parametri del gestore e dei relativi valori.
<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>
Risorse
I dati binari non vengono archiviati direttamente in un Management Pack. Al contrario, i metadati per la risorsa binaria vengono archiviati nel Management Pack e i dati binari reali vengono archiviati in un file di risorse esterno. I metadati comprendono un identificatore univoco, il nome del file, i dati di creazione, la data di modifica e le informazioni sull'accessibilità.
I dati binari possono comprendere risorse generiche, immagini, assembly, definizioni di report e moduli. Nell'esempio riportato di seguito viene illustrata una risorsa XML generica, una di assembly e un'altra di report.
<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>
Form
I moduli vengono definiti in un Management Pack. È possibile utilizzare i moduli per visualizzare e modificare una singola istanza di un tipo o di una classe combinata.
I moduli sono basati su Windows Presentation Framework (WPF) e sono definiti negli assembly. L'assembly e la classe che contengono le implementazioni del modulo di un Management Pack vengono inclusi nella relativa sezione delle risorse. Come per qualsiasi risorsa binaria in un Management Pack che usa il nuovo schema comune, il Management Pack stesso non contiene i dati binari per il modulo. Solo il manifesto delle risorse viene specificato nel Management Pack.
L'utente può specificare le proprie informazioni di configurazione per il modulo nel Management Pack. Nell'esempio seguente, la sezione Configurazione contiene una proprietà ShowXboxes . Queste informazioni di configurazione non vengono valutate dal processo di verifica del Management Pack; viene interpretato solo dall'implementazione del modulo.
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
Creare un file Management Pack per gestire i proiettori
I Management Pack vengono usati per indirizzare ed estendere le funzionalità di Service Manager. Questo articolo usa proiettori come esempio per descrivere le varie sezioni di un Management Pack e per definire i vari oggetti necessari per la gestione dei proiettori in un'organizzazione.
Questo articolo include un esempio completo di Management Pack con le estensioni necessarie per gestire i proiettori in un'organizzazione. Inoltre, viene descritto come importare un Management Pack utilizzando un cmdlet di Windows PowerShell.
Questo articolo descrive le sezioni seguenti di un Management Pack:
Il Manifesto
TypeDefinitions per creare enumerazioni e relazioni della classe
Form
Questo articolo descrive anche le sezioni seguenti di un Management Pack che contengono dichiarazioni e definizioni per l'interfaccia utente e gli elementi di localizzazione:
Categorie
Presentazione
Estensioni della classe
Sezione manifesto
La prima sezione di un Management Pack contiene il manifesto. Il manifesto identifica il Management Pack e dichiara tutti i riferimenti ad altri Management Pack.
Nell'esempio riportato di seguito viene mostrata la sezione Manifest di un Management Pack progettato per registrare i proiettori in un'organizzazione.
<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
Nella sezione Riferimenti non usare valori non alfanumerici, ad esempio '.', nell'alias per un riferimento.
Creare classi nella sezione TypeDefinitions
La sezione successiva di un Management Pack contiene le definizioni dei tipi. La sezione TypeDefinitions di un Management Pack contiene le definizioni di classi, enumerazioni e relazioni utilizzate dal Management Pack.
Nell'esempio seguente viene illustrata una classe che contiene informazioni sui proiettori:
<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>
Di seguito viene fornita la spiegazione sezione per sezione della definizione dei tipi in essa contenute.
Sezione ClassTypes
L'elemento ClassType definisce la classe del proiettore:
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
L'attributo ID è l'identificatore univoco di questa classe. È impostato su:
ID="System.ConfigItem.Projector"
L'attributo Base è l'ID della classe da cui deriva tale classe. Poiché un proiettore è un tipo di elemento di configurazione, è impostato su:
Base="System!System.ConfigItem"
La notazione di System! indica che questa classe, System.ConfigItem, si trova nel Management Pack a cui fa riferimento l'alias System.
L'attributo Hosted definisce se questa classe è ospitata da un'altra classe. In questo caso, un'istanza di questa classe può esistere solo quando esiste un'istanza di host che la contiene. Per questo esempio, i proiettori non sono ospitati da nulla; pertanto, l'attributo Hosted è impostato su false:
Hosted="false"
Se si imposta l'attributo Hosted su true si indica che la classe è ospitata da un'altra classe. Una relazione di hosting deve essere dichiarata nella sezione RelationshipTypes .
L'attributo Accessibility definisce se altre classi possono derivare da questa classe. Nei casi in cui si desidera permettere ad altri di creare una versione più specifica della classe, impostare questo attributo su public, ad esempio:
Accessibility="Public"
Impostando l'attributo Accessibility su Internal si impedisce che altre classi possano derivare da questa classe.
L'attributo Abstract definisce se possano essere create istanze di questa classe o se la classe debba solo essere usata per altre classi come classe padre da cui derivare. In questo esempio, l'attributo è impostato su false. Se si imposta questo attributo su true significa che non sarà possibile creare direttamente nessuna istanza di questa classe e che questa classe potrà essere usata soltanto come classe padre.
La sezione successiva della definizione della classe contiene le proprietà della classe. Il codice XML che definisce le proprietà della classe per questo esempio è definito nell'esempio di codice riportato di seguito:
<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" />
Ogni elemento Property presenta i seguenti attributi:
L'attributo ID , che indica l'identificatore univoco della proprietà.
L'attributo Type , che indica il tipo di dati della proprietà.
L'attributo Key . Se si imposta questo attributo su true significa che questa proprietà dovrà essere usata per identificare in modo univoco questa classe.
Creare tipi di enumerazione
Le enumerazioni del tipo di dati enum sono tipi di dati speciali. Le enumerazioni vengono utilizzate per vincolare i dati consentiti per una proprietà a una serie specifica di valori. Le enumerazioni possono essere gerarchiche; un'enumerazione può essere basata su un'altra enumerazione.
Le enumerazioni sono definite nella sezione EnumertionTypes di un pacchetto della soluzione. Una definizione di enumerazione contiene l'enumerazione principale, seguita dai valori di enumerazione effettivi.
Ogni EnumerationValue accetta alcuni attributi:
In questo esempio è definita un'enumerazione per tenere traccia della condizione dei proiettori. Di seguito viene definita l'enumerazione:
ID è l'identificatore per l'enumerazione o un valore di enumerazione.
Accessibility specifica se l'enumeratore può contenere altri enumeratori.
ParentName è un attributo che specifica l' ID del padre del valore dell'enumeratore.
<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>
Creare un modulo
I moduli di Service Manager sono basati su moduli WPF (Windows Presentation Framework). Service Manager estende WPF con attributi semplici aggiunti alla definizione XML e consente a Service Manager di associare i dati dal Management Pack al modulo.
I moduli di Service Manager possono essere creati usando diversi strumenti, tra cui Microsoft Visual Studio o Microsoft Expression Blend. Poiché i moduli sono basati su XML, possono essere definiti anche utilizzando un qualunque editor XML.
Nell'esempio riportato di seguito viene illustrata una definizione di modulo creata mediante Microsoft Expression Blend. Questo modulo contiene quattro controlli, tre caselle di testo e una casella combinata, associati alle proprietà della classe Proiettore definite in precedenza:
<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>
Per abilitare l'associazione dei controlli nel modulo alle proprietà della classe definite in un Management Pack, è necessario specificare un numero di elementi.
Associa controlli di testo
Per associare caselle di testo alle proprietà della classe in un Management Pack, aggiungere un tag Percorso di associazione alla proprietà Text del controllo casella di testo, ad esempio:
{Binding Path=SerialNumber, Mode=TwoWay}
Questo tag associa il controllo della casella di testo alla proprietà SerialNumber della classe Proiettore definita in precedenza nel Management Pack e specifica che si tratta di un'associazione bidirezionale. Il valore della proprietà viene recuperato dal database e visualizzato nella casella di testo quando la maschera viene caricata e il valore della proprietà viene archiviato nuovamente nel database se viene modificato dall'utente.
Associa caselle combinate
Per consentire al modulo di recuperare i dati di enumerazione dal Management Pack sottostante e associarli a un controllo presente nel modulo, è necessario definire una classe helper nel code-behind nel modulo. Questa classe helper deve contenere un metodo che restituisca un'enumerazione definita nel Management Pack. Per restituire un'enumerazione, utilizzare il metodo GetEnumerations del Management Pack corrente. Questa istanza è accessibile con la classe ConsoleContextHelper dal Service Manager Software Development Kit (SDK). Nell'esempio seguente, una classe helper definisce un metodo GetStatusValues che recupera i valori per l'enumerazione ProjectorCondition definita in precedenza nel Management Pack:
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
Per accedere a questo metodo, è necessario definire alcuni aspetti nella definizione del modulo nel Management Pack.
Innanzitutto, alla definizione del modulo viene aggiunto uno spazio dei nomi che punta al code behind del modulo. In questo esempio, lo spazio dei nomi è SMFormsDemo:
xmlns:local="clr-namespace:SMFormsDemo"
Quindi è necessario definire un ObjectDataProvider per fornire i valori per la casella combinata che visualizza lo stato del proiettore. Questo ObjectDataProvider è definito come risorsa:
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
Il provider di dati specifica l'oggetto e il nome del metodo che recupera i valori di enumerazione dal Management Pack.
Infine, per associare la casella combinata ai valori di enumerazione definiti nel Management Pack, viene aggiunto un attributo ItemsSource alla definizione della casella combinata. Questo attributo specifica dove recuperare i valori di enumerazione, ad esempio:
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
Successivamente vengono aggiunti gli elementi SelectedItem e ItemTemplate dalla definizione Extensible Application Markup Language (XAML) del controllo della casella combinata. Nell'esempio seguente viene mostrata la definizione di una casella combinata con inclusa l'associazione 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>
Sezione Categoria
La sezione Category di un Management Pack raggruppa insieme gli elementi del management Pack per semplificare l'esplorazione.
I primi due <Category>
elementi dell'esempio vengono usati per controllare la visualizzazione delle attività New e Edit nella visualizzazione Proiettori .
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
I secondi due elementi Category nel Management Pack di esempio vengono usati per rendere l'enumerazione della condizione del proiettore nella visualizzazione Elenchi nel riquadro Creazione nella console di Service Manager. Ciò consente all'utente di personalizzare i valori:
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
Aggiungendo questa categoria nell'esempio seguente fa sì che l'attività Modifica appaia nella vista Elenchi per il EnumerationValue che viene puntato nell'attributo Target :
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
Sezione Presentazione
La sezione Presentation di un Management Pack dichiara e definisce gli elementi correlati all'interfaccia utente, tra cui dichiarazioni di moduli, categorie e attività della console.
Sezione Forms
La sezione Forms dichiara i moduli utilizzati dal Management Pack. Nell'esempio seguente viene specificato dove trovare il modulo che è stato definito per visualizzare e modificare le istanze della classe Proiettore . Ciò consente di associare il modulo alla classe Proiettore definita nel Management Pack:
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
Nell'esempio precedente sono stati utilizzati i seguenti attributi:
L'attributo TypeName contiene lo spazio dei nomi e il nome della classe del modulo.
L'attributo ID contiene l'identificatore univoco di questa istanza del modulo.
L'attributo Target contiene il nome della classe a cui è associato il modulo.
L'attributo Assembly punta alla risorsa esterna che contiene il modulo.
L'attributo Accessibility definisce se questo modulo può essere personalizzato.
Definire una visualizzazione
La sezione Views di un Management Pack contiene le definizioni delle viste dell'interfaccia utente (UI). Queste viste consentono di filtrare e visualizzare gli oggetti in un Management Pack.
<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>
L'attributo Destinazione vista punta alla classe che verrà utilizzata dalla vista per la visualizzazione.
Nell'esempio precedente si fa riferimento al Management Pack Console di Service Manager. Questo Management Pack contiene la definizione di un tipo di vista utilizzato. In questa istanza viene definito il tipo di vista SMConsole!GridViewType .
AdvancedListSupportClass definisce un numero di parametro, il più importante dei quali è il parametro TargetClass . Impostare questo parametro sull' ID del ClassType che verrà visualizzato in questa vista. Per visualizzare le colonne che sono proprietà del ClassType, utilizzare l'elemento Column e associarlo all'attributo PropertyID .
L'attributo IsRecurring dell'elemento ListSupportClass determina se la vista si aggiornerà automaticamente. L'attributo RecurrenceFrequency definisce l'intervallo di aggiornamento in millisecondi. In questo esempio l'intervallo di aggiornamento è impostato su 1 secondo, ma non è consigliato per le installazioni di produzione.
Definire le cartelle
La definizione di una cartella determina la posizione nella struttura ad albero in cui viene visualizzata la vista. In questo esempio viene definito un elemento di configurazione in modo che sia adatto solo per posizionare la visualizzazione nella cartella esistente per gli elementi di configurazione nell'area di lavoro Elementi di configurazione:
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
Nell'esempio precedente, l'attributo ElementID contiene un riferimento alla vista che è stata creata. L'attributo Folder punta a una cartella Folders.Proiettors , che a sua volta ha la radice definita nell'area di lavoro Gestione configurazione della console di Service Manager. Questa cartella radice è definita nel Management Pack Gestione configurazione.
L'elemento ImageReference esegue il mapping della vista creata in precedenza con un'icona definita nello spazio dei nomi Configuration Management :
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
Localizzazione tramite la sezione LanguagePacks
La sezione LanaguagePacks di un Management Pack definisce le risorse stringa e i mapping per gli elementi del Management Pack.
Nell'esempio enumerationValueProjectorCondition.Working deve essere visualizzato come Working. A questo scopo è necessario definire per ciascuno i nomi di visualizzazione:
Visualizza: Tutti i proiettori
Enumerazioni: in elaborazione, interrotte, in riparazione, nuove
<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>
È possibile creare ulteriori elementi LanguagePack , se necessario, per ogni lingua aggiuntiva desiderata. La stringa di visualizzazione corretta viene visualizzata all'utente in base alle impostazioni locali dell'utente.
Risorse
La sezione Resources di un Management Pack contiene i riferimento alle risorse binarie, contenute in assembly separati dal Management Pack. Nell'esempio seguente viene definita una risorsa che punta all'assembly, il quale contiene il modulo utilizzato dalla classe Proiettore :
<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" />
Estensioni delle classi
Un'estensione della classe è una classe che aggiunge proprietà a una classe esistente. Nella maggior parte dei casi, la classe esistente si trova in un Management Pack bloccato. Nei casi in cui la classe esistente non si trova in un Management Pack sealed, l'estensione della classe deve essere contenuta nello stesso Management Pack della classe che viene estesa.
Un'estensione della classe eredita le proprietà di tutte le classi padre, ad esempio:
La classe A contiene una proprietà denominata Property1
La classe B deriva da (o estende) la classe A e disporrà di una proprietà denominata Property1. La proprietà viene ereditata dalla classe A, il padre o la classe base.
La definizione della classe B aggiunge una proprietà denominata Property2.
Qualsiasi estensione della classe che deriva dalla classe B erediterà Property1 e Property2.
Nell'esempio riportato di seguito viene illustrata una definizione di estensione della 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>
Questa estensione della classe estende la classe System.WorkItem.Incident e aggiunge una nuova proprietà denominata TimeOnIncident.
La definizione di un'estensione della classe è simile a quella di una definizione della classe. Due attributi dell'elemento ClassType vengono utilizzati per specificare una definizione della classe: gli attributi Base e IsExtensionType .
L'attributo Base specifica l' ID della classe padre da cui deriva l'estensione della classe. In questo caso, il valore dell'attributo viene impostato su Incident!System.WorkItem.Incident. Questo valore comprende l' Alias del nome completo del Management Pack, che contiene la classe oggetto dell'estensione, un punto esclamativo e il nome della classe base. Per ulteriori informazioni, vedere l'esempio seguente.
L'attributo IsExtensionType definisce se la classe è un'estensione della classe base. Poiché TimeOnIncident è un'estensione della classe Indicent , la proprietà viene impostata su true:
IsExtensionType="true"
L'altra opzione è false, che indica che non è un'estensione di un'altra classe ma una nuova classe che eredita dalla base. Il valore predefinito è false. Pertanto, questo attributo non deve essere usato se la classe non è un'estensione.
Esempio completo
Nell'esempio di codice riportato di seguito viene illustrato il Management Pack completo contenente l'estensione della 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>
Importare un Management Pack usando un cmdlet
È possibile usare il cmdlet Import-SCSMManagementPack di Windows PowerShell per importare un Management Pack di Service Manager, ad esempio:
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
Questo documento non descrive come importare e usare i Management Pack nella console di Service Manager. Per informazioni sull'uso dei Management Pack nella console di Service Manager, vedere Uso dei Management Pack in Service Manager.
Esempio completo di Management Pack
Gli esempi di codice seguenti rappresentano il Management Pack di esempio completo usato per esempi in questo articolo, oltre alla definizione del modulo e al code-behind C# per il modulo.
Management Pack
<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>
Definizione modulo
<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>
Code-behind del modulo
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);
}
}
}