Utiliser des fichiers XML du pack d’administration Service Manager
Pour des personnalisations détaillées des packs d’administration, la console Service Manager et l’outil de création Service Manager peuvent ne pas suffire et vous devrez peut-être créer ou modifier directement des fichiers du pack d’administration. L’utilisation directe de fichiers de pack d’administration nécessite des connaissances approfondies dans plusieurs domaines tels que le schéma commun System Center et la structure des packs d’administration.
Cette section fournit des informations générales et des instructions qui peuvent vous aider à créer et modifier des packs d’administration pour personnaliser Service Manager.
Modifications du schéma commun de System Center
Service Manager inclut une version mise à jour du schéma du pack d’administration System Center. Ce schéma est maintenant appelé Schéma commun System Center, et inclut un certain nombre d’améliorations et d’ajouts destinés à améliorer les fonctionnalités existantes et à activer les fonctionnalités service Manager. Cet article décrit les modifications apportées au schéma commun System Center.
Restrictions relatives aux propriétés et aux propriétés
Le schéma commun étend les classes via plusieurs nouveaux types de propriété. Ces types de propriétés incluent les types binaires, énumérateurs et incrémentateurs automatiques.
En outre, vous pouvez définir des restrictions sur certaines valeurs de propriété. Par exemple, vous pouvez définir une restriction de l'expression régulière sur une valeur de propriété de chaîne. Dans l’exemple suivant, la propriété BuildingName a une restriction d’expression régulière définie afin que seule une valeur qui contient le mot Building suivi d’un espace et qu’un nombre soit considéré comme valide.
<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>
Images
Les images ne sont pas stockées dans un pack d’administration. Par conséquent, la <PresentationTypes>
section du pack d’administration ne contient plus les balises ou <ImageData>
les <Images>
balises<Image>
. Utilisez plutôt une ressource d'image.
<Resources>
<Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>
</Resources>
Énumérations
Le schéma commun prend en charge les énumérations. Les énumérations sont une arborescence de valeurs que vous pouvez utiliser pour limiter la valeur d'une propriété ou d'un attribut.
Chaque énumération possède un attribut obligatoire ID unique et éventuellement un attribut Parent .
Dans l'exemple suivant, l'énumération XBoxState est définie avec trois valeurs possibles : En cours d'exécution, Arrêté et Erreur.
<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>
Dans l'exemple suivant, la classe Xbox définit une propriété enum de type 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>
Relations
La fonctionnalité de définition des relations a été améliorée dans le schéma commun. Le type RelationshipType possède désormais les sous-éléments Source et Target munis de propriétés ID pouvant être utilisés en tant que noms complets. En outre, vous pouvez définir une cardinalité minimale et maximale pour la source et la cible ; par exemple, des relations de 1 à 1 ou de 0 à plusieurs.
La cardinalité n’est pas appliquée par le processus de validation du pack d’administration, mais elle est destinée à aider à définir des interfaces utilisateur pour le pack d’administration. Par exemple, la cardinalité peut être vérifiée pour déterminer si un champ peut être représenté dans un formulaire par une zone de texte ou une liste.
Important
Les valeurs MaxCardinality définies comme étant supérieures à 1 sont traitées comme un nombre illimité.
Si vous ajoutez un nouveau type de relation à partir de votre pack d'administration, l'utilisateur doit avoir des privilèges suffisants pour mettre à jour toutes les propriétés des instances de classe sources et cibles du type de relation afin de créer une instance du nouveau type de relation.
Dans l’exemple suivant, une relation d’hébergement appelée HasXboxes entre le type Lobby et le type Xbox est définie. Dans cette définition de relation, chaque type Lobby peut avoir plusieurs types 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 combinaison
Les classes de combinaison représentent un regroupement de plusieurs types associés dans le pack d'administration, semblable aux affichages définis dans une base de données Microsoft SQL Server pour pouvoir renvoyer des données provenant de plusieurs tables. Les combinaisons de classe stockent et récupèrent toutes les données agrégées en une seule opération effectuée dans la base de données, et elles facilitent la définition des interfaces utilisateur d'un pack d'administration.
Dans l'exemple suivant, une production est définie pour un affichage de gestion des incidents. Cette projection combine des composants différents liés à un incident en une seule unité pouvant être utilisée plus facilement pour les formulaires et les opérations de bases de données.
<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>
Tâches de console
Les tâches de console ont été étendues dans le schéma commun. Auparavant, les tâches de console étaient de simples pointeurs vers un répertoire d'application et un nom de fichier exécutable. Désormais, les tâches de console sont implémentées sous forme de code de gestionnaire dans un assembly Microsoft .NET Framework. Le code de gestionnaire fait référence à l'assembly qui héberge le code, le nom de gestionnaire et une liste de valeurs nommées pouvant être être passées comme arguments au gestionnaire.
Dans l'exemple suivant, le gestionnaire Some.Handler.Name est défini dans l'assembly MyLibrary.Resources.Assembly . une liste des paramètres du gestionnaire et ses valeurs est également définie.
<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>
Ressources
Les données binaires ne sont pas stockées directement dans un pack d’administration. Au lieu de cela, les métadonnées relatives à la ressource binaire sont stockées dans le pack d'administration, et les données binaires réelles sont stockées en externe dans un fichier de ressources. Les métadonnées incluent un identificateur unique, le nom de fichier, les données de création, la date de modification et les informations sur l'accessibilité.
Les données binaires peuvent inclure des ressources génériques, des images, des assemblys, des définitions de rapport et des formulaires. L'exemple suivant décrit une ressource XML générique, une ressource d'assembly et une ressource rapport.
<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>
Formulaires
Les formulaires sont définis dans un pack d'administration. Vous pouvez utiliser les formulaires pour afficher et modifier une seule instance d'un type ou une classe de combinaison.
Les formulaires sont basés sur WPF (Windows Presentation Framework) et sont définis dans les assemblys. L'assembly et la classe qui contiennent les implémentations de formulaire d'un pack d'administration sont incluses dans la section de ressources du pack d'administration. Comme pour toute ressource binaire dans un pack d’administration qui utilise le nouveau schéma commun, le pack d’administration lui-même ne contient pas les données binaires du formulaire. Seul le manifeste de la ressource est spécifié dans le pack d'administration.
Vous pouvez spécifier vos propres informations de configuration du formulaire dans le pack d'administration. Dans l'exemple suivant, la section Configuration contient une propriété ShowXboxes . Ces informations de configuration ne sont pas évaluées par le processus de vérification du pack d’administration ; elle n’est interprétée que par l’implémentation du formulaire.
<Forms>
<Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">
<Configuration>
<ShowXboxes>yes</ShowXboxes>
</Configuration>
</Form>
</Forms>
Créer un fichier de pack d’administration pour gérer les projecteurs
Les packs d’administration sont utilisés pour diriger et étendre les fonctionnalités de Service Manager. Cet article utilise des projecteurs comme exemple pour décrire les différentes sections d’un pack d’administration et pour définir les différents objets nécessaires à la gestion des projecteurs dans une organisation.
Cet article inclut un exemple complet de pack d’administration avec les extensions nécessaires pour gérer les projecteurs dans une organisation. En outre, elle décrit comment importer un pack d'administration à l'aide d'une applet de commande Windows PowerShell.
Cet article décrit les sections suivantes d’un pack d’administration :
Le manifeste
Les TypeDefinitions permettant de créer des énumérations de classe et des relations
Formulaires
Cet article décrit également les sections suivantes d’un pack d’administration qui contient des déclarations et des définitions pour les éléments d’interface utilisateur et de localisation :
Catégories
Présentation
Extensions de classe
Section Manifeste
La première section d'un pack d'administration contient le manifeste. Le manifeste identifie le pack d'administration et déclare toutes les références aux autres packs d'administration.
L'exemple suivant illustre la section Manifest du pack d'administration qui a été conçue pour effectuer le suivi des projecteurs au sein d'une organisation.
<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>
Important
Dans la section Références, n’utilisez pas de valeurs nonphanumériques , telles qu’un « . », dans l’alias d’une référence.
Créer des classes dans la section TypeDefinitions
La section suivante du pack d'administration contient des définitions de type. La section TypeDefinitions d'un pack d'administration contient des définitions de classes, d'énumérations et de relations qui sont utilisées par le pack d'administration.
L'exemple suivant montre une classe qui contient des informations sur les projecteurs :
<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>
Voici une explication section par section de ce que contient la définition de type.
Section ClassTypes
L'élément ClassType définit la classe de projecteur :
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
L'attribut ID est l'identificateur unique de cette classe. Elle est définie sur :
ID="System.ConfigItem.Projector"
L'attribut Base est l'ID de la classe de laquelle est dérivée cette classe. Dans la mesure où un projecteur est un type d'élément de configuration, sa valeur est la suivante :
Base="System!System.ConfigItem"
La notation de System ! indique que cette classe, System.ConfigItem, se trouve dans le pack d’administration référencé par le système d’alias.
L'attribut Hosted permet de définir si cette classe doit être hébergée par une autre classe. Dans ce cas, une instance de cette classe ne peut exister que lorsqu'elle est hébergée par une autre instance. Pour cet exemple, les projecteurs ne sont pas hébergés par quoi que ce soit ; par conséquent, l’attribut Hosted a la valeur false :
Hosted="false"
Si l'attribut Hosted a la valeur true , cela indique que la classe est hébergée par une autre classe. Une relation d'hébergement doit être déclarée dans la section RelationshipTypes .
L'attribut Accessibility permet de définir si les autres classes peuvent être dérivées de cette classe. Si vous souhaitez permettre aux utilisateurs de créer une version plus spécifique de votre classe, définissez cet attribut sur public. Exemple :
Accessibility="Public"
Si l'attribut Accessibility est défini sur Internal , les autres classes ne pourront pas être dérivées de cette classe.
L'attribut Abstract permet de définir si des instances de cette classe peuvent être créées, ou si la classe doit uniquement être utilisée comme classe parente d'autres classes dérivées. Dans cet exemple, cet attribut est défini sur false. Si cet attribut a la valeur true , aucune instance de cette classe ne pourra être créée directement, et la classe pourra uniquement être utilisée comme classe parente.
La section suivante de la définition de classe contient les propriétés de classe. Le code XML qui définit les propriétés de classe de cet exemple est défini dans l'exemple de code suivant :
<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" />
Chaque élément Property possède les attributs suivants :
L'attribut ID , qui désigne l'identificateur unique de la propriété.
L'attribut Type , qui indique le type de données de la propriété.
L'attribut Key . Si cet attribut a la valeur true , cette propriété doit uniquement être utilisée pour identifier cette classe.
Créer des types d’énumération
Les énumérations du type de données enum sont des types de données spéciaux. Les énumérations sont utilisées pour limiter à un ensemble spécifique de valeurs les données autorisées pour une propriété donnée. Les énumérations peuvent être hiérarchiques, c'est-à-dire qu'une énumération peut être basée sur une autre énumération.
Les énumérations sont définies dans la section EnumertionTypes d'un pack de solution. La définition d'une énumération contient l'énumération racine, suivie des valeurs de l'énumération.
Chaque EnumerationValue accepte quelques attributs :
Dans cet exemple, une énumération est définie pour le suivi de la condition des projecteurs. L'énumération est définie de la façon suivante :
ID est l'identificateur de l'énumération ou la valeur de l'énumération.
Accessibility spécifie si l'énumérateur peut contenir d'autres énumérateurs.
ParentName est un attribut qui spécifie l' ID du parent de la valeur de l'énumérateur.
<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>
Créer un formulaire
Les formulaires Service Manager sont basés sur des formulaires WPF (Windows Presentation Framework). Service Manager étend WPF avec des attributs simples ajoutés à la définition XML et autorise Service Manager à lier des données du pack d’administration au formulaire.
Les formulaires Service Manager peuvent être créés à l’aide de plusieurs outils différents, notamment Microsoft Visual Studio ou Microsoft Expression Blend. S'agissant de formulaires XML, il est également possible de les définir à l'aide de n'importe quel éditeur XML.
L'exemple suivant montre une définition de formulaire créé à l'aide de Microsoft Expression Blend. Ce formulaire comprend quatre contrôles, trois zones de texte et une zone de liste déroulante, qui sont liés aux propriétés de la classe Projector précédemment définies :
<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>
Pour permettre la liaison des contrôles du formulaire et des propriétés de classe définies dans un pack d'administration, certains éléments doivent être spécifiés.
Lier des contrôles de texte
Pour lier des zones de texte à des propriétés de classe dans un pack d’administration, ajoutez une balise Binding Path à la propriété Text du contrôle Text de la zone de texte, par exemple :
{Binding Path=SerialNumber, Mode=TwoWay}
Cette balise lie le contrôle de zone de texte à la propriété SerialNumber de la classe Projector définie dans le pack d'administration, et spécifie qu'il doit s'agir d'une liaison bidirectionnelle. La valeur de la propriété est récupérée à partir de la base de données et affichée dans la zone de texte lorsque le formulaire est chargé, et la valeur de propriété est stockée dans la base de données si elle est modifiée par l’utilisateur.
Lier des zones de liste modifiable
Pour permettre au formulaire de récupérer les données d'énumération depuis le pack d'administration sous-jacent et de les lier à un contrôle du formulaire, une classe d'assistance doit être définie dans le code-behind du formulaire. Cette classe d'assistance doit contenir une méthode qui retourne une énumération définie dans le pack d'administration. Pour renvoyer une énumération, utilisez la méthode GetEnumerations du pack d'administration. Cette instance est accessible avec la classe ConsoleContextHelper à partir du Kit de développement logiciel (SDK) Service Manager. Dans l'exemple suivant, une classe d'assistance définit une méthode GetStatusValues qui récupère les valeurs de l'énumération ProjectorCondition définie dans le pack d'administration :
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
Pour accéder à cette méthode, vous devez d'abord définir certains éléments dans la définition du formulaire du pack d'administration.
Tout d'abord, un espace de noms pointant vers l'espace de noms code behind du formulaire est ajouté à la définition du formulaire. Dans cet exemple, l'espace de noms est SMFormsDemo:
xmlns:local="clr-namespace:SMFormsDemo"
Ensuite, un ObjectDataProvider doit être défini pour fournir les valeurs de la zone de liste déroulante qui affiche l'état du projecteur. Ce ObjectDataProvider est défini en tant que ressource :
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
Ce fournisseur de données spécifie le nom de l'objet et de la méthode qui récupèrent les valeurs d'énumération depuis le pack d'administration.
Enfin, pour lier la zone de liste déroulante aux valeurs d'énumération définies dans le pack d'administration, un attribut ItemsSource est ajouté à la définition de la zone de liste déroulante. Cet attribut spécifie l'emplacement auquel récupérer les valeurs d'énumération. Exemple :
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
Ensuite, les éléments SelectedItem et ItemTemplate sont ajoutés à la définition XAML du contrôle zone de liste déroulante. L'exemple suivant montre la définition de la zone de liste déroulante avec le code XAML de liaison :
<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>
Section Catégorie
La section Category d'un pack d'administration regroupe les éléments de pack d'administration pour une exploration facilitée.
Les deux <Category>
premiers éléments de l’exemple sont utilisés pour contrôler l’affichage des tâches Nouveau et Modifier dans la vue Projecteurs .
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
Les deux deuxièmes éléments De catégorie dans l’exemple de pack d’administration sont utilisés pour faire apparaître l’énumération des conditions de projecteur dans l’affichage Listes dans le volet Création dans la console Service Manager. Cela permet à l'utilisateur de personnaliser les valeurs :
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
Dans l'exemple suivant, l'ajout de cette catégorie fait apparaître la tâche Modifier dans la vue Listes pour la EnumerationValue référencée dans l'attribut Target :
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
Section Présentation
La section Presentation d'un pack d'administration déclare et définit les éléments relatifs à l'interface utilisateur. Il s'agit notamment des déclarations de formulaires, des catégories et des tâches de console.
Section Formulaires
La section Forms déclare les formulaires qui sont utilisés par votre pack d'administration. L'exemple suivant indique où trouver le formulaire défini pour l'affichage et la modification des instances de la classe Projector . Ceci lie le formulaire à la classe Projector définie dans le pack d'administration :
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
Les attributs suivants sont utilisés dans l'exemple précédent :
L'attribut TypeName contient l'espace de noms et le nom de classe du formulaire.
L'attribut ID contient l'identificateur unique de cette instance de formulaire.
L'attribut Target contient le nom de la classe à laquelle est lié ce formulaire.
L'attribut Assembly pointe vers la ressource externe qui contient le formulaire.
L'attribut Accessibility définit si ce formulaire peut être personnalisé.
Définir une vue
La section Views d'un pack d'administration contient les définitions des vues de l'interface utilisateur. Ces vues peuvent être utilisées pour filtrer et afficher des objets dans un pack d'administration.
<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'attribut View Target pointe vers la classe qui sera utilisée pour l'affichage de la vue.
Dans l'exemple précédent, le pack d'administration de la console Service Manager est référencé. Ce pack d'administration contient une définition d'un type de vue en cours d'utilisation. Dans cette instance, le type de vue SMConsole!GridViewType est défini.
AdvancedListSupportClass définit un certain nombre de paramètres, dont le plus important est TargetClass . Définissez ce paramètre sur l' ID du ClassType qui apparaît dans cette vue. Pour afficher les colonnes correspondant aux propriétés de ClassType, utilisez l'élément Column , puis liez-le à l'attribut PropertyID .
L'attribut IsRecurring de l'élément ListSupportClass détermine si la vue peut automatiquement s'actualiser. L'attribut RecurrenceFrequency définit l'intervalle d'actualisation en millisecondes. Dans cet exemple, l’intervalle d’actualisation est défini sur 1 seconde, mais ce n’est pas recommandé pour les installations de production.
Définir des dossiers
La définition d'un dossier détermine l'emplacement de l'arborescence de navigation auquel la vue est affichée. Dans cet exemple, un élément de configuration est défini de sorte qu’il convient uniquement de placer l’affichage sous le dossier existant pour les éléments de configuration dans l’espace de travail Éléments de configuration :
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
Dans l'exemple précédent, l'attribut ElementID contient une référence à la vue créée. L’attribut Folder pointe vers un dossier Folders.Projecteurs, qui à son tour a sa racine telle que définie dans l’espace de travail Gestion de la configuration de la console Service Manager. Ce dossier racine est défini dans le pack d'administration Gestion de la configuration.
L'élément ImageReference mappe la vue créée précédemment sur une icône définie dans l'espace de noms Configuration Management :
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
Localisation à l’aide de la section LanguagePacks
La section LanaguagePacks d'un pack d'administration définit les ressources de chaîne et les mappages des éléments du pack d'administration.
Dans l’exemple, l’élément EnumerationValueProjectorCondition.Working doit apparaître comme Working. Pour ce faire, les noms complets de chacun des éléments suivants doivent être définis :
Vue : All projectors
Énumérations : working, broken, in repair, new
<LanguagePacks>
<LanguagePack ID="ENU" IsDefault="true">
<DisplayStrings>
<DisplayString ElementID="AllProjectorsView">
<Name>All Projectors</Name>
<Description>This displays all projectors</Description>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Working">
<Name>Working</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.Broken">
<Name>Broken</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.BeingRepaired">
<Name>In Repair</Name>
</DisplayString>
<DisplayString ElementID="ProjectorCondition.New">
<Name>New</Name>
</DisplayString>
</DisplayStrings>
</LanguagePack>
</LanguagePacks>
Si nécessaire, vous pouvez créer des éléments LanguagePack supplémentaires, pour chacune des langues requises. La chaîne d’affichage correcte s’affiche à l’utilisateur en fonction des paramètres régionaux de l’utilisateur.
Ressources
La section Resources d'un pack d'administration contient des références aux ressources binaires contenues dans des assemblys ne faisant pas partie du pack d'administration. Dans l'exemple suivant, une ressource définie pointe vers l'assembly qui contient le formulaire utilisé par la classe Projector :
<Assembly ID="ProjectorFormsAssembly"
Accessibility="Public"
QualifiedName="SMFormsDemo, Version=1.0.0.0" FileName="SMFormsDemo.dll" CreationDate="1900-10-12T13:13:13" ModifiedDate="2008-12-12T12:12:12" />
Extensions de classe
Une extension de la classe est une classe qui ajoute des propriétés à une classe existante. Dans la plupart des cas, cette classe existante se trouve dans un pack d'administration scellé. Dans les cas où la classe existante ne se trouve pas dans un pack d’administration scellé, l’extension de classe doit être contenue dans le même pack d’administration que la classe qui est étendue.
Une extension de classe hérite des propriétés de toutes les classes parentes, par exemple :
La classe A possède une propriété nommée Property1
La classe B dérive de la classe A ou étend celle-ci et par conséquent possède une propriété appelée Property1. Cette propriété est héritée d'une classe A, le parent ou la classe de base)
La définition de la classe B ajoute une propriété appelée Property2.
Toute extension de classe dérivant de la classe B hérite de Property1 et Property2.
L'exemple suivant montre une définition de l'extension 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>
Cette extension de classe étend la classe System.WorkItem.Incident et ajoute une nouvelle propriété nommée TimeOnIncident.
La définition d'une extension de classe est similaire à celle d'une définition de classe. Deux attributs de l'élément ClassType sont utilisées pour définir une définition de classe : l'attribut Base et l'attribut IsExtensionType .
L'attribut Base spécifie l'élément ID de la classe parente à partir de laquelle extension de classe est dérivée. Dans ce cas, la valeur d'attribut possède la valeur Incident!System.WorkItem.Incident. Cette valeur contient l'élément Alias du nom complet du pack d'administration, qui contient la classe en cours d'extension, un point d'exclamation, puis le nom d'une classe de base. Pour plus d'informations, reportez-vous à l'exemple suivant.
L'attribut IsExtensionType définit si cette classe est une extension de la classe de base. TimeOnIncident étant une extension vers la classe Incident , cette propriété possède la valeur true:
IsExtensionType="true"
L’autre option est false, ce qui indique qu’il ne s’agit pas d’une extension d’une autre classe, mais d’une nouvelle classe qui hérite de la base. La valeur par défaut est false . Par conséquent, cet attribut n’a pas besoin d’être utilisé si la classe n’est pas une extension.
Exemple complet
L'exemple de code suivant montre le pack d'administration complet contenant l'extension 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>
Importer un pack d’administration à l’aide d’une applet de commande
Vous pouvez utiliser l’applet de commande Windows PowerShell Import-SCSMManagementPack pour importer un pack d’administration Service Manager, par exemple :
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
Ce document ne décrit pas comment importer et utiliser des packs d’administration dans la console Service Manager. Pour plus d’informations sur l’utilisation des packs d’administration dans la console Service Manager, consultez Utilisation des packs d’administration dans Service Manager.
Exemple de pack d’administration complet
Les exemples de code suivants représentent l’exemple complet de pack d’administration utilisé pour les exemples de cet article en plus de la définition de formulaire et du code-behind C# pour le formulaire.
Pack d’administration
<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>
Définition de formulaire
<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 du formulaire
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);
}
}
}
Étapes suivantes
- Scellez un pack d’administration.