Arbeta med Service Manager XML-filer för hanteringspaket
Viktigt
Den här Service Manager har nått slutet av supporten, rekommenderar vi att du uppgraderar till Service Manager 2022.
För avancerade anpassningar av hanteringspaket kanske Service Manager-konsolen och Service Manager Authoring Tool inte räcker, och du kan behöva redigera eller ändra hanteringspaketfiler direkt. Att arbeta direkt med hanteringspaketfiler kräver djupgående kunskaper 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 det System Center vanliga schemat
Service Manager innehåller en uppdaterad version av schemat System Center hanteringspaket. 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 befintliga funktioner och Service Manager funktioner. I det här avsnittet beskrivs ändringar i det gemensamma System Center-schemat.
Egenskaper och egenskapsbegränsningar
Det gemensamma schemat utökar klasser genom flera nya egenskapstyper. Egenskapstyperna är binär, uppräkning och automatisk stegvis ökning.
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 har definierats så att endast ett värde som innehåller ordet "Building" 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 nödvändigt 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 Klassen Xbox 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. RelationshipType-typen har nu underelementen Source och Target 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 utökas inte under hanteringspaketverifieringen men är avsedd att göra det lättare 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
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 ( kallas HasXboxes) mellan Typen Xbox och Typen Xbox . I den här relationsdefinitionen kan varje Typ av Xbox 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 hanterarkod 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 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ärdata 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ären 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. I likhet med eventuella binärresurser i ett hanteringspaket som använder det nya gemensamma schemat, innehåller inte själva hanteringspaketet några binärdata 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 . Konfigurationsinformationen utvärderas inte under hanteringspaketverifieringen utan tolkas bara när formuläret införs.
<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. I det här avsnittet används projektorer som exempel för att beskriva olika delar av ett hanteringspaket och definiera olika objekt som behövs för att hantera projektorer i en organisation.
Här visas ett fullständigt hanteringspaketexempel med de tillägg som behövs för att hantera projektorer i en organisation. Dessutom beskrivs hur du importerar ett hanteringspaket med en Windows PowerShell cmdlet.
Följande delar av ett hanteringspaket beskrivs:
Manifestet
TypeDefinitions som skapar klassuppräkningar och relationer
Formulär
Det här avsnittet beskriver också följande avsnitt i ett hanteringspaket som innehåller deklarationer och definitioner för användargränssnittselement (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 aliaset 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. Det anges som:
ID="System.ConfigItem.Projector"
Basattributet är ID:t för den klass 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 det hanteringspaket som aliaset System refererar till.
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 värdar projektorer inte av något; Därför är attributet Hosted inställt på false:
Hosted="false"
Om du anger attributet Hostedtill true betyder det att klassen finns i en annan klass. En värdrelation måste deklareras i avsnittet RelationshipTypes .
Attributet Hjälpmedel definierar om andra klasser kan härledas från den här klassen. I fall där du kanske vill tillåta att andra skapar en mer specifik version av klassen anger du det här attributet till offentligt, till exempel:
Accessibility="Public"
Om du anger attributetHjälpmedel till Internt förhindrar du att andra klasser här härledas från den här klassen.
Attributet Abstrakt definierar om instanser av den här klassen kan skapas eller om klassen bara ska användas som en överordnad klass till andra klasser att härleda 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 kan inga instanser av den här klassen 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.
Attributet Nyckel. Om du anger attributet till true anger du 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.
Tillgänglighet anger om uppräkningsatorn kan innehålla andra uppräkningar.
ParentName är ett attribut som anger ID: t för det överordnade värdet för 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å Windows WPF-formulär (Presentation Framework). Service Manager utökar WPF med enkla attribut som läggs till i XML-definitionen och gör att Service Manager kan 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 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 klassegenskaperna för projektorer 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 en bindningssökvägstagg i textrkontrollens textegenskap, till exempel:
{Binding Path=SerialNumber, Mode=TwoWay}
Den här taggen binder textrrutorna till egenskapen SerialNumber för klassen Projektor som definierades i hanteringspaketet och anger att detta ska vara en tvåvägsbindning. Egenskapsvärdet hämtas från databasen och visas i textrutan när formuläret läses in. Egenskapsvärdet lagras i databasen igen om det ändras av användaren.
Bindningskombinationsrutor
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 koden bakom 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 för det aktuella hanteringspaketet. Den här instansen nås med klassen ConsoleContextHelper från Service Manager -development kit (SDK). I följande exempel definierar en hjälpklass en GetStatusValues-metod som hämtar värdena för uppräkningen ProjectorCondition 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ärden 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, för att binda kombinationsrutan till de uppräkningsvärden som definieras i hanteringspaketet, läggs ett ItemsSource-attribut till i definitionen av kombinationsrutan. 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 Extensible Application Markup Language definitionen (XAML) för kombinationsrrutorna. 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å första <Category> elementen i exemplet används för att styra visningen av uppgifterna Nyttoch Redigera i vyn Projektorer .
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
De andra två kategorielementen i exempelhanteringspaketet används för att göra så att projektorns villkorsuppräkning visas i vyn Listor 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 aktiviteten Redigera i vyn Listor för det EnumerationValue som pekar på i attributet Target:
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
Avsnittet Presentation
Avsnittet Presentation i ett hanteringspaket deklarerar och definierar grä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 Projektor . Detta binder formuläret till klassen Projektor 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å den klass som det här formuläret är bundet till.
Sammansättningsattributet 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. 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! GridViewType-vytypen har definierats.
AdvancedListSupportClass definierar ett antal parametrar, varav den viktigaste är parametern TargetClass. Ange den här parametern till ID :t för den ClassType som 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 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 på 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 tidigare skapades 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 LanguagePacks-avsnittet
I avsnittet OmguagePacks i ett hanteringspaket definieras strängresurser och mappningar för hanteringspaketelement.
I exemplet måste EnumerationValueProjectorCondition.Working visas som Working. För att göra detta måste visningsnamn definieras för vart och ett av följande:
Vy: Alla projektorer
Uppräkningar: fungerande, bruten, 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 om det behövs för varje ytterligare språk som du behöver. Rätt visningssträng visas för användaren baserat på användarens språk.
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 Projektor :
<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 ursprungliga klassen inte finns i ett förseglat hanteringspaket, måste klasstillägget finnas i samma hanteringspaket som den ursprungliga klassen.
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, överordnad eller basklass)
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 ClassType-elementet används för att definiera en klassdefinition: attributet Base och attributet IsExtensionType .
Basattributet 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 ett tillägg till basklassen. Eftersom TimeOnIncident är ett tillägg till klassen Incident är den här egenskapen inställd på true:
IsExtensionType="true"
Det andra alternativet är falskt, vilket indikerar att det inte är ett tillägg till en annan klass utan en ny klass som ärver från basen. Standardvärdet är false. Därför behöver det här attributet 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 exempelhanteringspaket som används för exempel i det här avsnittet, 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>
Bakom 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);
}
}
}