L2DBForm.xaml-källkod
Den här sidan innehåller och beskriver XAML-källfilen för WPF-databindning med LINQ till XML-exempel.
Övergripande gränssnittsstruktur
Som vanligt för ett WPF-projekt innehåller den här filen ett överordnat element, ett Window XML-element som är associerat med den härledda klassen L2XDBFrom
i LinqToXmlDataBinding
-namnområdet.
Klientområdet är inneslutet i en StackPanel med en ljusblå bakgrund. Den här panelen innehåller fyra DockPanel gränssnittsavsnitt avgränsade med Separator staplar. Syftet med dessa avsnitt beskrivs här.
Varje avsnitt innehåller en etikett som identifierar den. I de två första avsnitten roteras den här etiketten 90 grader med hjälp av en LayoutTransform. Resten av avsnittet innehåller gränssnittselement som är lämpliga för det avsnittet, till exempel textblock, textrutor och knappar. Ibland används ett barnobjekt StackPanel för att justera dessa kontroller.
Avsnitt om fönsterresursen
Den inledande taggen <Window.Resources>
på rad 9 anger början av fönstrets resursavsnitt. Den slutar med den stängande taggen på rad 35.
Taggen <ObjectDataProvider>
, som sträcker sig över raderna 11 till 25, deklarerar en ObjectDataProvider, med namnet LoadedBooks
, som använder en XElement som källa.
XElement initieras genom att ett inbäddat XML-dokument (ett CDATA
-element) parsas. Observera att tomt utrymme bevaras när det inbäddade XML-dokumentet deklareras och även när det parsas. Tomt utrymme bevaras eftersom TextBlock-kontrollen, som används för att visa den råa XML-koden, inte har några särskilda XML-formateringsfunktioner.
Slutligen definieras en DataTemplate med namnet BookTemplate
på raderna 28 till och med 34. Den här mallen används för att visa inläggen i avsnittet Book List UI. Den använder databindning och dynamiska egenskaper för LINQ till XML för att hämta bokens ID och boknamn via följande tilldelningsoperationer:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Databindningskod
Förutom elementet DataTemplate används databindning på ett antal andra platser i den här filen.
I den inledande <StackPanel>
-taggen på rad 38 anges egenskapen DataContext för den här panelen till dataprovidern LoadedBooks
.
DataContext="{Binding Source={StaticResource LoadedBooks}}
Om du ställer in datakontexten blir det möjligt (på rad 46) för TextBlock med namnet tbRawXml
att visa den råa XML-koden genom att binda till den här dataleverantörens Xml
egenskap:
Text="{Binding Path=Xml}"
I ListBox i avsnittet Boklista användargränssnitt, på raderna 58 till och med 62, anges mallen för dess visningsobjekt till den BookTemplate
som definierats i fönstrets resursavsnitt:
ItemTemplate ="{StaticResource BookTemplate}"
På raderna 59 till 62 är de faktiska värdena för böckerna bundna till den här listrutan:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
Det tredje användargränssnittsavsnittet, Redigera vald bok, binder först DataContext för den överordnade StackPanel till det markerade objektet från användargränssnittet i avsnittet Boklista (rad 82):
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Den använder sedan dubbelriktad databindning, så att de aktuella värdena för bokelementen visas och uppdateras från de två textrutorna i den här panelen. Databindning till dynamiska egenskaper liknar databindningen som används i BookTemplate
datamall:
Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"
Det sista avsnittet i användargränssnittet, Lägg till ny bok, använder inte databindning i sin XAML-kod. I stället finns databindningen i dess händelsehanteringskod i filen L2DBForm.xaml.cs.
Exempel
Beskrivning
Obs!
Vi rekommenderar att du kopierar följande kod nedan till en kodredigerare, till exempel C#-källkodsredigeraren i Visual Studio, så att radnumren blir enklare att spåra.
Kod
<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>
Kommentarer
Information om C#-källkoden för händelsehanterare som är associerade med WPF-gränssnittselementen finns i L2DBForm.xaml.cs källkod.
Se även
.NET Desktop feedback