Dela via


Arbeta med XML-filer för Service Manager-hanteringspaket

Viktigt

Den här versionen av Service Manager har nått slutet av supporten. Vi rekommenderar att du uppgraderar till Service Manager 2022.

För avancerade anpassningar av hanteringspaket räcker det kanske inte med Service Manager-konsolen och Service Manager Authoring Tool, och du kan behöva redigera eller ändra hanteringspaketfiler direkt. Att arbeta direkt med hanteringspaketfiler kräver djupgående kunskap inom flera områden, till exempel System Center Common Schema och strukturen för hanteringspaket.

Det här avsnittet innehåller bakgrundsinformation och riktlinjer som kan hjälpa dig att skapa och ändra hanteringspaket för att anpassa Service Manager.

Ändringar i System Center Common Schema

Service Manager innehåller en uppdaterad version av System Center Management Pack-schemat. Det här schemat kallas nu för System Center Common Schema och innehåller ett antal förbättringar och tillägg som är avsedda att förbättra de befintliga funktionerna och aktivera Service Manager funktioner. I den här artikeln beskrivs ändringarna i System Center Common Schema.

Egenskaper och egenskapsbegränsningar

Det gemensamma schemat utökar klasser genom flera nya egenskapstyper. Dessa egenskapstyper omfattar typerna binärfil, uppräkning och automatisk inkrement.

Dessutom kan du ange begränsningar för vissa egenskapsvärden. Du kan till exempel ange en begränsning till reguljära uttryck för ett strängegenskapsvärde. I följande exempel har egenskapen BuildingName en begränsning för reguljära uttryck som definieras så att endast ett värde som innehåller ordet Byggnad följt av ett blanksteg och ett tal anses vara giltigt.


<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>  

Avbildningar

Avbildningar lagras inte i ett hanteringspaket. <PresentationTypes>-delen i hanteringspaketet innehåller därför inte längre taggarna <Images>, <Image> eller <ImageData>. Använd i stället en avbildningsresurs.

<Resources>  
   <Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>  
</Resources>  

Uppräkningar

Det gemensamma schemat har stöd för uppräkningar. Uppräkningar är ett träd med värden som du kan använda för att begränsa värdet för en egenskap eller ett attribut.

Varje uppräkning har ett obligatoriskt unikt ID-attribut och ett valfritt överordnat attribut.

I följande exempel definieras XBoxState-uppräkningen med tre möjliga värden: Körs, Stoppad och Fel.


<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>  

I följande exempel definierar Xbox-klassen en uppräkningsegenskap av typen 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>  

Relationer

Relationsdefinitioner har fått utökad kapacitet i det gemensamma schemat. Typen RelationshipType har nu underelementen Källa och Mål med ID-egenskaper som kan användas som visningsnamn. Dessutom kan du definiera lägsta och högsta kardinalitet för både källan och målet. till exempel 1-till-1- eller 0-till-många-relationer.

Kardinaliteten tillämpas inte av verifieringsprocessen för hanteringspaket, men den är avsedd att hjälpa till att definiera användargränssnitt för hanteringspaketet. Du kan exempelvis kontrollera kardinalitet för att avgöra om ett fält ska visas i ett formulär i form av en textruta eller en lista.

Viktigt

Alla MaxCardinality-värden som definieras som större än 1 bearbetas som obegränsade.

Om du lägger till en ny relationstyp från ett eget hanteringspaket måste användarna ha behörighet för att uppdatera alla egenskaper för käll- och målinstanserna av relationstypen för att kunna skapa en instans av den nya relationstypen.

I följande exempel definieras en värdrelation med namnet HasXboxes mellan lobbytypen och Xbox-typen . I den här relationsdefinitionen kan varje lobbytyp ha flera Xbox-typer .


<RelationshipType ID="HasXBboxes" Accessibility="Public" Base="System!System.Hosting">  
   <Source ID="Source" Type="Lobby" />  
   <Target ID="Target" Type="Xbox" MinCardinality="0" MaxCardinality="9999" />  
</RelationshipType>  

Kombinationsklasser

Kombinationsklasser representerar en aggregering av flera relaterade typer i hanteringspaketet, ungefär som vyer som definieras i en Microsoft SQL Server-databas som kan returnera data från flera tabeller. Kombinationsklasser lagrar och hämtar alla sammanställda data i en enda åtgärd på databasen, och kan göra det enklare att definiera användargränssnitt för ett hanteringspaket.

I följande exempel har en projektion definierats för en incidenthanteringsvy. I den här projektionen kombineras flera olika komponenter som hör till en incident i en enda enhet som lättare kan hanteras i formulär- och databasåtgärder.


<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>  

Konsoluppgifter

Konsoluppgifter har utökats i det gemensamma schemat. Tidigare var konsoluppgifter enkla pekare till namnet på en programkatalog och körbar fil. Konsoluppgifter implementeras nu som hanteringskod i en Microsoft .NET Framework-sammansättning. Hanterarkoden refererar till den sammansättning som innehåller koden, hanterarnamnet och en lista över namngivna värden som kan skickas som argument till hanteraren.

I följande exempel definieras Some.Handler.Name-hanteraren i sammansättningen MyLibrary.Resources.Assembly . En lista över hanterarparametrar och deras värden anges också.

<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>  

Resurser

Binära data lagras inte direkt i ett hanteringspaket. I stället lagras metadata om binärresursen i hanteringspaketet medan de faktiska binärdata lagras externt i en resursfil. Metadata innehåller en unik identifierare, filnamnet, skapandedatum, ändringsdatum och tillgänglighetsinformation.

Binärdata kan omfatta allmänna resurser, avbildningar, sammansättningar, rapportdefinitioner och formulär. I följande exempel visas en allmän XML-resurs, en sammansättningsresurs och en rapportresurs.


<Resources>  
   <Resource ID="TestLibrary.Resources.Test1" Accessibility="Public" FileName="res1.xml"/>  
   <Resource ID="TestLibrary.Resources.Test2" Accessibility="Public" FileName="res2.xml"/>  
   <Assembly ID="TestLibrary.Resources.Assembly1" Accessibility="Public" QualifiedName="Baz, Version=1.0.0.0" FileName="baz.dll"/>  
   <Assembly ID="TestLibrary.Resources.Assembly2" Accessibility="Public" QualifiedName="Yoyo, Version=1.0.0.0" FileName="yoyo.dll">  
      <Dependency ID="TestLibrary.Resources.Assembly1"/>  
   </Assembly>  
   <ReportResource ID="TestLibrary.Resources.Report1" Accessibility="Public" MIMEType="text/xml" FileName="res1.xml"/>  
   <Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>  
</Resources>  

Formulär

Formulär definieras i ett hanteringspaket. Du kan använda formulär för att visa och ändra en enskild instans av en typ- eller kombinationsklass.

Formulär baseras på WINDOWS Presentation Framework (WPF) och de definieras i sammansättningar. Den sammansättning och klass som innehåller införda formulär för ett hanteringspaket finns i hanteringspaketets resursdel. Precis som med alla binära resurser i ett hanteringspaket som använder det nya gemensamma schemat innehåller själva hanteringspaketet inte binära data för formuläret. Det är bara resursmanifestet som anges i hanteringspaketet.

Du kan ange egen konfigurationsinformation för formuläret i hanteringspaketet. I följande exempel innehåller avsnittet Konfiguration en ShowXboxes-egenskap . Den här konfigurationsinformationen utvärderas inte av verifieringsprocessen för hanteringspaket. det tolkas endast av formulärimplementeringen.


    <Forms>  
   <Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">  
   <Configuration>  
      <ShowXboxes>yes</ShowXboxes>  
   </Configuration>  
   </Form>  
</Forms>  

Skapa en hanteringspaketfil för att hantera projektorer

Hanteringspaket används för att dirigera och utöka funktionerna i Service Manager. Den här artikeln använder projektorer som exempel för att beskriva de olika avsnitten i ett hanteringspaket och för att definiera de olika objekt som behövs för att hantera projektorer i en organisation.

Den här artikeln innehåller ett komplett hanteringspaketexempel med nödvändiga tillägg för att hantera projektorer i en organisation. Dessutom beskrivs hur du importerar ett hanteringspaket med hjälp av en Windows PowerShell cmdlet.

I den här artikeln beskrivs följande avsnitt i ett hanteringspaket:

  • Manifestet

  • TypeDefinitions som skapar klassuppräkningar och relationer

  • Formulär

Den här artikeln beskriver också följande avsnitt i ett hanteringspaket som innehåller deklarationer och definitioner för användargränssnitt (UI) och lokaliseringselement:

  • Kategorier

  • Presentation

  • Klasstillägg

Manifestavsnitt

Den första delen av ett hanteringspaket innehåller manifestet. Manifestet identifierar hanteringspaketet och anger eventuella referenser till andra hanteringspaket.

I följande exempel visas avsnittet Manifest i ett hanteringspaket som har utformats för att spåra projektorer i en 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>  

Viktigt

I avsnittet Referenser ska du inte använda icke-alfanumeriska värden, till exempel ".", i Alias för en referens.

Skapa klasser i avsnittet TypeDefinitions

Nästa del av ett hanteringspaket innehåller typdefinitioner. Avsnittet TypeDefinitions i ett hanteringspaket innehåller definitioner för klasser, uppräkningar och relationer som används av hanteringspaketet.

I följande exempel visas en klass som innehåller information om projektorer:


<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>  

Följande är en avsnitt-för-avsnitt-förklaring av vad typdefinitionen innehåller.

Avsnittet ClassTypes

Elementet ClassType definierar projektorklassen:

<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">

ID-attributet är den unika identifieraren för den här klassen. Den är inställd på:

ID="System.ConfigItem.Projector"

Base-attributet är ID:t för klassen som den här klassen härleds från. Eftersom en projektor är en typ av konfigurationsobjekt anges det som:

Base="System!System.ConfigItem"

Notationen för System! anger att den här klassen, System.ConfigItem, finns i hanteringspaketet som refereras av aliaset System.

Attributet Hosted definierar om den här klassen finns i en annan klass. I så fall kan det bara finnas en instans av klassen när det finns en värdinstans för den. I det här exemplet hanteras inte projektorer av någonting. Därför är attributet Hosted inställt på false:

Hosted="false"

Om du anger attributet Hosted till true betyder det att klassen finns i en annan klass. En värdrelation måste deklareras i avsnittet RelationshipTypes .

Attributet Accessibility definierar om andra klasser kan härledas från den här klassen. I fall där du kanske vill att andra ska kunna skapa en mer specifik version av klassen anger du det här attributet till offentligt, till exempel:

Accessibility="Public"

Om du anger attributet Tillgänglighet till Internt förhindrar du att andra klasser härleds från den här klassen.

Attributet Abstract definierar om instanser av den här klassen kan skapas eller om klassen bara ska användas som en överordnad klass till andra klasser som ska härledas från. I det här exemplet är det här attributet inställt på false. Om du anger det här attributet till true innebär det att inga instanser av den här klassen kan skapas direkt och att den här klassen endast kan användas som en överordnad klass.

Nästa del av klassdefinitionen innehåller klassegenskaperna. Den XML som anger klassegenskaperna i det här exemplet definieras i följande kodexempel:


<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"  />  

Varje egenskapselement har följande attribut:

  • ID-attributet, som anger egenskapens unika identifierare.

  • Attributet Typ, som anger egenskapens datatyp.

  • Nyckelattributet. Om du anger det här attributet till true betyder det att den här egenskapen ska användas för att unikt identifiera den här klassen.

Skapa uppräkningstyper

Uppräkningar av uppräkningsdatatypen är särskilda datatyper. Uppräkningar används för att begränsa vilka data som tillåts för en egenskap för en viss uppsättning värden. Uppräkningar kan vara hierarkiska. En uppräkning kan baseras på en annan uppräkning.

Uppräkningar definieras i avsnittet EnumertionTypes i ett lösningspaket . En uppräkningsdefinition innehåller rotuppräkningen följt av de faktiska uppräkningsvärdena.

Varje EnumerationValue accepterar några attribut:

I det här exemplet definieras en uppräkning för att spåra projektionernas tillstånd. Uppräkningen definieras av följande:

  • ID är identifieraren för uppräknings- eller uppräkningsvärdet.

  • Hjälpmedel anger om den här uppräknaren kan innehålla andra uppräknare.

  • ParentName är ett attribut som anger ID :t för det överordnade uppräkningsvärdet.


<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>  

Skapa ett formulär

Service Manager formulär baseras på WPF-formulär (Windows Presentation Framework). Service Manager utökar WPF med enkla attribut som läggs till i XML-definitionen och tillåter Service Manager att binda data från hanteringspaketet till formuläret.

Service Manager formulär kan skapas med hjälp av flera olika verktyg, inklusive Microsoft Visual Studio eller Microsoft Expression Blend. Eftersom formulären är XML-baserade kan de också definieras med hjälp av valfri XML-redigerare.

I följande exempel visas en formulärdefinition som har skapats med Microsoft Expression Blend. Det här formuläret innehåller fyra kontroller, tre textrutor och en kombinationsruta, som är bundna till de projector-klassegenskaper som definierades tidigare:


<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>  

För att kunna binda kontroller i formuläret till klassegenskaper som är definierade i ett hanteringspaket, måste du ange ett antal objekt.

Bindningstextkontroller

Om du vill binda textrutor till klassegenskaper i ett hanteringspaket lägger du till taggen Bindningssökväg i textrutekontrollens textegenskap, till exempel:

{Binding Path=SerialNumber, Mode=TwoWay}  

Den här taggen binder textrutekontrollen till egenskapen SerialNumber för projector-klassen som definierades i hanteringspaketet och anger att detta ska vara en dubbelriktad bindning. Värdet för egenskapen hämtas från databasen och visas i textrutan när formuläret läses in, och egenskapsvärdet lagras tillbaka till databasen om det ändras av användaren.

Kombinationsrutor för bindning

För att formuläret ska kunna hämta uppräkningsdata från det underliggande hanteringspaketet och binda det till en kontroll i formuläret måste en hjälpklass definieras i bakomliggande kod i formuläret. Hjälparklassen måste innehålla en metod som returnerar en uppräkning som är definierad i hanteringspaketet. Om du vill returnera en uppräkning använder du metoden GetEnumerations i det aktuella hanteringspaketet. Den här instansen nås med klassen ConsoleContextHelper från Service Manager Software Development Kit (SDK). I följande exempel definierar en hjälpklass en GetStatusValues-metod som hämtar värdena för projectorCondition-uppräkningen som definierades i hanteringspaketet:


public class helper  
{  
   public static ICollection<IDataItem> GetStatusValues()  
   {  
      return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);  
   }  
}  

För att metoden ska kunna användas måste några saker ha definierats i formulärdefinitionen i hanteringspaketet.

Först läggs ett namnområde som pekar på namnområdet för koden bakom för formuläret till i formulärdefinitionen. I det här exemplet är namnområdet SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Därefter måste en ObjectDataProvider definieras för att ange värdena för kombinationsrutan som visar projektorns status. Den här ObjectDataProvider definieras som en resurs:


<UserControl.Resources>  
   <ObjectDataProvider   
      ObjectType="{x:Type local:helper}"    
      MethodName="GetStatusValues"   
      x:Key="getStatusValues" />  
</UserControl.Resources>  

Dataprovidern anger objektet och metodnamnet som hämtar uppräkningsvärdena från hanteringspaketet.

Slutligen läggs ett ItemsSource-attribut till i kombinationsrutedefinitionen för att binda kombinationsrutan till de uppräkningsvärden som definieras i hanteringspaketet. Attributet anger var uppräkningsvärdena ska hämtas, till exempel:

ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"  

Därefter läggs elementen SelectedItem och ItemTemplate till i XAML-definitionen (Extensible Application Markup Language) för kombinationsrutekontrollen. I följande exempel visas kombinationsrutedefinitionen med bindande 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>  

Avsnittet Kategori

Avsnittet Kategori i ett hanteringspaket grupperar hanteringspaketelement för enklare navigering.

De två <Category> första elementen i exemplet används för att styra visningen av aktiviteterna Nytt och Redigera i projektorvyn .

<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />  
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />  

De andra två Kategori-elementen i exempelhanteringspaketet används för att få projektorvillkorsuppräkning att visas i Listor-vyn i fönstret Redigering i Service Manager-konsolen. Det gör att användaren kan anpassa värden:

<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>  

Om du lägger till den här kategorin i följande exempel visas uppgiften Redigera i Listor-vyn för uppräkningsvärdet som pekas på i attributet Target:

<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>  

Avsnittet Presentation

I avsnittet Presentation i ett hanteringspaket deklareras och definieras användargränssnittsrelaterade element. Detta är formulärdeklarationer, kategorier och konsoluppgifter.

Formuläravsnittet

I avsnittet Formulär deklareras formulär som används av ditt hanteringspaket. I följande exempel anges var du hittar formuläret som har definierats för att visa och redigera instanser av klassen Projector . Detta binder formuläret till klassen Projector som definieras i hanteringspaketet:


<Forms>  
   <Form TypeName="SMFormsDemo.TestControl"  
      ID="TestForm"  
      Target="System.ConfigItem.Projector"  
      Assembly="ProjectorFormsAssembly"  
      Accessibility="Public">  
   <Category>Form</Category>  
   </Form>  
</Forms>  

Följande attribut används i föregående exempel:

  • Attributet TypeName innehåller formulärets namnområde och klassnamn.

  • ID-attributet innehåller den unika identifieraren för den här formulärinstansen.

  • Attributet Target innehåller namnet på klassen som formuläret är bundet till.

  • Attributet Sammansättning pekar på den externa resurs som innehåller formuläret.

  • Attributet Hjälpmedel definierar om det här formuläret kan anpassas.

Definiera en vy

Avsnittet Vyer i ett hanteringspaket innehåller definitioner av användargränssnittsvyer (UI). Vyerna kan användas för att filtrera och visa objekt i ett hanteringspaket.

<View Target="System.ConfigItem.Projector"   
Enabled="true"  
TypeID="SMConsole!GridViewType"  
ID="AllProjectorsView"  
Accessibility="Public">  
<Category>NotUsed</Category>  
<Data>  
<Adapters>  
      <Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">  
                <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
   <AdapterType>  
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter  
   </AdapterType>  
      </Adapter>  
            <Adapter AdapterName="viewframework://adapters/ListDefault">  
              <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>  
              <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>  
            </Adapter>  
</Adapters>  
<ItemsSource>  
  <AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000"  treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >  
    <AdvancedListSupportClass.Parameters>  
                <QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>  
    </AdvancedListSupportClass.Parameters>  
    </AdvancedListSupportClass>  
    </ItemsSource>  
    <Criteria />  
</Data>  
<Presentation>  
<Columns>  
            <mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">  
              <mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />  
              <mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />  
              <mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />  
              <mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />  
              <mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />  
            </mux:ColumnCollection>      
</Columns>  
</Presentation>  
</View>  

View Target-attributet pekar på den klass som ska visas i vyn.

I föregående exempel refereras det till Service Manager-konsolens hanteringspaket. Det här hanteringspaketet innehåller en definition av en vytyp som används. I det här fallet SMConsole! Vytypen GridViewType har definierats.

AdvancedListSupportClass definierar ett antal parametrar, varav den viktigaste är targetclass-parametern. Ställ in den här parametern på ID :t för ClassType som ska visas i den här vyn. Om du vill visa kolumnerna som är egenskaper för ClassType använder du elementet Column och binder det till attributet PropertyID .

Attributet IsRecurring för elementet ListSupportClass avgör om vyn uppdateras automatiskt. Attributet RecurrenceFrequency definierar uppdateringsintervallet i millisekunder. I det här exemplet är uppdateringsintervallet inställt på 1 sekund, men det rekommenderas inte för produktionsinstallationer.

Definiera mappar

Genom att definiera mappar anger du platsen i navigeringsträdet där vyn ska visas. I det här exemplet definieras ett konfigurationsobjekt så att det bara är lämpligt att placera vyn under den befintliga mappen för konfigurationsobjekt i arbetsytan Konfigurationsobjekt :

<Folders>  
  <Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />  
</Folders>  
<FolderItems>  
   <FolderItem   
      ElementID="AllProjectorsView"   
      Folder="Folder.Projectors" />  
   </FolderItems>  

I föregående exempel innehåller attributet ElementID en referens till vyn som skapades. Mappattributet pekar på mappen Folders.Projectors, som i sin tur har sin rot enligt definitionen i arbetsytan Konfigurationshantering i Service Manager-konsolen. Denna rotmapp definieras i hanteringspaketet för konfigurationshanteringen.

ImageReference-elementet mappar vyn som skapades tidigare till en ikon som har definierats i namnområdet Konfigurationshantering:

<ImageReferences>  
  <ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />  
  <ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />  
</ImageReferences>  

Lokalisering med hjälp av avsnittet LanguagePacks

Avsnittet LanaguagePacks i ett hanteringspaket definierar strängresurser och mappningar för hanteringspaketelement.

I exemplet måste EnumerationValueProjectorCondition.Working visas som Working(Arbeta). För att göra detta måste visningsnamn definieras för vart och ett av följande:

  • Vy: Alla projektorer

  • Uppräkningar: arbete, trasigt, i reparation, ny

  <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>  

Du kan skapa ytterligare LanguagePack-element efter behov för varje ytterligare språk som du behöver. Rätt visningssträng visas för användaren baserat på användarens nationella inställningar.

Resurser

Avsnittet Resurser i ett hanteringspaket innehåller referenser till binära resurser, som finns i sammansättningar som är separata från hanteringspaketet. I följande exempel definieras en resurs som pekar på sammansättningen som innehåller formuläret som används av klassen 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" />  

Klasstillägg

Ett klasstillägg är en klass som ger en annan, befintlig klass fler egenskaper. Den ursprungliga klassen finns oftast i ett förseglat hanteringspaket. Om den befintliga klassen inte finns i ett förseglat hanteringspaket måste klasstillägget finnas i samma hanteringspaket som den klass som utökas.

Ett klasstillägg får samma egenskaper som den överordnade klassen som tillägget baseras på. Exempel:

  • Klass A har egenskapen Egenskap1.

  • Klass B är ett klasstillägg som baseras på klass A, och har därför också egenskapen Egenskap1. Den här egenskapen ärvs från klass A, den överordnade eller basklassen)

  • Klass B har en definition som dessutom innehåller egenskapen Egenskap2.

  • Alla eventuella klasstillägg som baseras på klass B kommer att ärva både Egenskap1 och Egenskap2.

    Det här är ett exempel på en definition av ett klasstillägg:


<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>  

Det här klasstillägget utökar klassen System.WorkItem.Incident och lägger till en ny egenskap med namnet TimeOnIncident.

Ett klasstillägg har samma sorts definition som en klass. Två attribut för elementet ClassType används för att definiera en klassdefinition: basattributet och attributet IsExtensionType .

Base-attributet anger ID:t för den överordnade klassen som klasstillägget härleds från. I det här fallet är attributvärdet inställt på Incident! System.WorkItem.Incident. Det här värdet innehåller aliaset för det fullständiga hanteringspaketnamnet, som innehåller klassen som utökas, ett utropstecken och sedan namnet på basklassen. Mer information finns i exemplet nedan.

Attributet IsExtensionType definierar om den här klassen är en förlängning av basklassen. Eftersom TimeOnIncident är ett tillägg till klassen Incident anges den här egenskapen till true:

IsExtensionType="true"  

Det andra alternativet är falskt, vilket indikerar att det inte är en förlängning av en annan klass utan en ny klass som ärver från basen. Standardvärdet är false. Det här attributet behöver därför inte användas om klassen inte är ett tillägg.

Fullständigt exempel

Följande är en fullständig exempelkod för ett hanteringspaket med ett klasstillägg.

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>  

Importera ett hanteringspaket med hjälp av en cmdlet

Du kan använda cmdleten Windows PowerShell Import-SCSMManagementPack för att importera ett Service Manager-hanteringspaket, till exempel:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

Det här dokumentet beskriver inte hur du importerar och använder hanteringspaket i Service Manager-konsolen. Information om hur du använder hanteringspaket i Service Manager-konsolen finns i Använda hanteringspaket i Service Manager.

Exempel på fullständigt hanteringspaket

Följande kodexempel representerar det fullständiga exempelhanteringspaketet som används för exempel i den här artikeln utöver formulärdefinitionen och C#-koden bakom för formuläret.

Hanteringspaket

<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>  

Formulärdefinition


<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>  

Bakomliggande formulärkod


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);  
      }  
   }  
}  

Nästa steg