L2DBForm.xaml-broncode
Deze pagina bevat en beschrijft het XAML-bronbestand voor de WPF-gegevensbinding met behulp van LINQ naar XML-voorbeeld.
Algemene ui-structuur
Zoals gebruikelijk is voor een WPF-project, bevat dit bestand één bovenliggend element, een Window XML-element dat is gekoppeld aan de afgeleide klasse L2XDBFrom
in de LinqToXmlDataBinding
naamruimte.
Het clientgebied bevindt zich in een StackPanel die een lichtblauwe achtergrond krijgt. Dit deelvenster bevat vier DockPanel UI-secties, gescheiden door Separator balken. Het doel van deze secties wordt hier beschreven.
Elke sectie bevat een label waarmee het wordt geïdentificeerd. In de eerste twee secties wordt dit label 90 graden gedraaid door het gebruik van een LayoutTransform. De rest van de sectie bevat UI-elementen die geschikt zijn voor het doel van die sectie, bijvoorbeeld tekstblokken, tekstvakken en knoppen. Soms wordt een kind StackPanel gebruikt om deze kind-elementen uit te lijnen.
Sectie Venstermiddelen
De openingstag <Window.Resources>
op regel 9 geeft het begin van de window resource sectie aan. Het eindigt met de afsluitende tag op regel 35.
De <ObjectDataProvider>
tag, die regel 11 tot en met 25 omvat, declareert een ObjectDataProvider, met de naam LoadedBooks
, die een XElement als bron gebruikt. De XElement wordt geïnitialiseerd door een ingesloten XML-document (een CDATA
element) te parseren. U ziet dat witruimte behouden blijft bij het declareren van het ingesloten XML-document en ook wanneer het wordt geparseerd. Witruimte blijft behouden omdat het TextBlock besturingselement, dat wordt gebruikt om de onbewerkte XML weer te geven, geen speciale XML-opmaakmogelijkheden heeft.
Ten slotte wordt een DataTemplate met de naam BookTemplate
gedefinieerd op regels 28 tot en met 34. Deze sjabloon wordt gebruikt om de vermeldingen weer te geven in de sectie Boeklijst gebruikersinterface. Voor het ophalen van de boek-id en boeknaam wordt gebruikgemaakt van gegevensbinding en dynamische eigenschappen van LINQ to XML door middel van de volgende toewijzingen:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Code voor gegevensbinding
Naast het DataTemplate-element wordt gegevensbinding gebruikt op een aantal andere plaatsen in dit bestand.
In de openende <StackPanel>
-tag op regel 38 is de eigenschap DataContext van dit deelvenster ingesteld op de LoadedBooks
gegevensbron.
DataContext="{Binding Source={StaticResource LoadedBooks}}
Als u de gegevenscontext instelt, is het mogelijk (op regel 46) voor de TextBlock met de naam tbRawXml
om de onbewerkte XML weer te geven door binding te maken met de eigenschap Xml
van deze gegevensprovider:
Text="{Binding Path=Xml}"
De ListBox in de sectie Boeklijst UI, op regel 58 tot en met 62, stelt de sjabloon voor de weergaveitems in op de BookTemplate
gedefinieerd in de vensterresourcesectie:
ItemTemplate ="{StaticResource BookTemplate}"
Vervolgens zijn op regel 59 tot en met 62 de werkelijke waarden van de boeken gebonden aan deze keuzelijst:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
De derde sectie van de gebruikersinterface, Bewerken van Geselecteerd Boek, verbindt eerst de DataContext van de ouder StackPanel met het momenteel geselecteerde item in de Boeklijst-sectie van de gebruikersinterface (regel 82):
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Vervolgens wordt gebruikgemaakt van gegevensbinding in twee richtingen, zodat de huidige waarden van de boekelementen worden weergegeven in en bijgewerkt van, de twee tekstvakken in dit deelvenster. Gegevensbinding met dynamische eigenschappen is vergelijkbaar met de gegevensbinding die wordt gebruikt in de BookTemplate
-gegevenssjabloon:
Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"
De laatste sectie van de gebruikersinterface, Nieuwe boek toevoegen, gebruikt geen gegevensbinding in de XAML-code. In plaats daarvan bevindt gegevensbinding zich in de gebeurtenisverwerkingscode in het bestand L2DBForm.xaml.cs.
Voorbeeld
Beschrijving
Notitie
U wordt aangeraden de volgende code hieronder te kopiëren naar een code-editor, zoals de C#-broncode-editor in Visual Studio, zodat regelnummers gemakkelijker kunnen worden bijgehouden.
Code
<Window x:Class="LinqToXmlDataBinding.L2XDBForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:xlinq="clr-namespace:System.Xml.Linq;assembly=System.Xml.Linq"
xmlns:local="clr-namespace:LinqToXmlDataBinding"
Title="WPF Data Binding using LINQ-to-XML" Height="665" Width="500" ResizeMode="NoResize">
<Window.Resources>
<!-- Books provider and inline data -->
<ObjectDataProvider x:Key="LoadedBooks" ObjectType="{x:Type xlinq:XElement}" MethodName="Parse">
<ObjectDataProvider.MethodParameters>
<system:String xml:space="preserve">
<![CDATA[
<books xmlns="http://www.mybooks.com">
<book id="0">book zero</book>
<book id="1">book one</book>
<book id="2">book two</book>
<book id="3">book three</book>
</books>
]]>
</system:String>
<xlinq:LoadOptions>PreserveWhitespace</xlinq:LoadOptions>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<!-- Template for use in Books List listbox. -->
<DataTemplate x:Key="BookTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Margin="3" Text="{Binding Path=Attribute[id].Value}"/>
<TextBlock Margin="3" Text="-"/>
<TextBlock Margin="3" Text="{Binding Path=Value}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<!-- Main visual content container -->
<StackPanel Background="lightblue" DataContext="{Binding Source={StaticResource LoadedBooks}}">
<!-- Raw XML display section -->
<DockPanel Margin="5">
<Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">XML
<Label.LayoutTransform>
<RotateTransform Angle="90"/>
</Label.LayoutTransform>
</Label>
<TextBlock Name="tbRawXml" Height="200" Background="LightGray" Text="{Binding Path=Xml}" TextTrimming="CharacterEllipsis" />
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- List box to display all books section -->
<DockPanel Margin="5">
<Label Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" FontWeight="Bold">Book List
<Label.LayoutTransform>
<RotateTransform Angle="90"/>
</Label.LayoutTransform>
</Label>
<ListBox Name="lbBooks" Height="200" Width="415" ItemTemplate ="{StaticResource BookTemplate}">
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
</ListBox>
<Button Margin="5" DockPanel.Dock="Right" Height="30" Width ="130" Content="Remove Selected Book" Click="OnRemoveBook">
<Button.LayoutTransform>
<RotateTransform Angle="90"/>
</Button.LayoutTransform>
</Button>
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- Edit current selection section -->
<DockPanel Margin="5">
<TextBlock Margin="5" Height="30" Width="65" DockPanel.Dock="Right" Background="LightGray" TextWrapping="Wrap" TextAlignment="Center">
Changes are live!
<TextBlock.LayoutTransform>
<RotateTransform Angle="90"/>
</TextBlock.LayoutTransform>
</TextBlock>
<StackPanel>
<Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Edit Selected Book</Label>
<StackPanel Margin="1" DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}">
<StackPanel Orientation="Horizontal">
<Label Width="40">ID:</Label>
<TextBox Name="editAttributeTextBox" Width="410" Text="{Binding Path=Attribute[id].Value}">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Edit the selected book ID and see it changed.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Width="40">Value:</Label>
<TextBox Name="editValueTextBox" Width="410" Text="{Binding Path=Value}" Height="25">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Edit the selected book Value and see it changed.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
</StackPanel>
</StackPanel>
</DockPanel>
<Separator Height="4" Margin="5" />
<!-- Add new book section -->
<DockPanel Margin="5">
<Button Margin="5" Height="30" DockPanel.Dock="Right" Click ="OnAddBook">Add Book
<Button.LayoutTransform>
<RotateTransform Angle="90"/>
</Button.LayoutTransform>
</Button>
<StackPanel>
<Label Width="450" Background="Gray" FontSize="12" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" FontWeight="Bold">Add New Book</Label>
<StackPanel Margin="1">
<StackPanel Orientation="Horizontal">
<Label Width="40">ID:</Label>
<TextBox Name="tbAddID" Width="410">
<TextBox.ToolTip>
<TextBlock FontWeight="Bold" TextAlignment="Center">
<Label>Enter a book ID and Value pair, then click Add Book.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Label Width="40">Value:</Label>
<TextBox Name="tbAddValue" Width="410" Height="25">
<TextBox.ToolTip>
<TextBlock FontWeight="UltraBold" TextAlignment="Center">
<Label>Enter a book ID and Value pair, then click Add Book.</Label>
</TextBlock>
</TextBox.ToolTip>
</TextBox>
</StackPanel>
</StackPanel>
</StackPanel>
</DockPanel>
</StackPanel>
</Window>
Opmerkingen
Zie L2DBForm.xaml.cs broncodevoor de C#-broncode voor de gebeurtenis-handlers die zijn gekoppeld aan de WPF UI-elementen.
Zie ook
.NET Desktop feedback