Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oldal tartalmazza és ismerteti a WPF adatkötys XAML-forrásfájlt, amely aLINQ to XML példát használja.
Általános felhasználói felületi struktúra
A WPF-projektekhez megszokott módon ez a fájl egy szülőelemet, egy Window XML-elemet tartalmaz, amely a L2XDBFrom névtér származtatott osztályához LinqToXmlDataBinding van társítva.
Az ügyfélterület egy világoskék háttérrel rendelkező StackPanel belül található. Ez a panel négy DockPanel felhasználói felületi szakaszt tartalmaz, amelyeket Separator sávok választanak el egymástól. Ezeknek a szakaszoknak a rendeltetését itt .
Minden szakasz tartalmaz egy címkét, amely azonosítja azt. Az első két szakaszban ezt a címkét 90 fokkal elforgatjuk egy LayoutTransformsegítségével. A szakasz többi része az adott szakasz céljának megfelelő felhasználói felületi elemeket tartalmaz, például szövegblokkokat, szövegdobozokat és gombokat. Néha egy StackPanel gyermekvezérlő kerül felhasználásra a gyermekvezérlők igazítására.
Ablak-erőforrás szakasz
A 9. sor nyitó <Window.Resources> címkéje az ablak erőforrásszakaszának kezdetét jelzi. A záró címkével végződik a 35. sorban.
A 11. és 25. sor között kiterjedő <ObjectDataProvider> címke egy ObjectDataProvider-t deklarál, amelyet LoadedBooks-nek neveztek el, és amely forrásként egy XElement-at használja. A XElement beágyazott XML-dokumentum (CDATA elem) elemzésével inicializálódik. Figyelje meg, hogy a beágyazott XML-dokumentum deklarálásakor és elemzésekor is megmarad a szabad terület. A szabad terület megmarad, mert a nyers XML megjelenítésére használt TextBlock vezérlőelem nem rendelkezik speciális XML-formázási képességekkel.
Végül egy DataTemplate nevű BookTemplate a 28–34. sorban van definiálva. Ez a sablon a Könyvlista felhasználói felület szakasz bejegyzéseinek megjelenítésére szolgál. Adatkötést és LINQ-t használ a dinamikus XML-tulajdonságokhoz a könyvazonosító és a könyvnév lekéréséhez a következő hozzárendeléseken keresztül:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Adatkötési kód
A DataTemplate elem mellett az adatkötést a fájl számos más helyén is használják.
A 38. sor nyitó <StackPanel> címkéjében a panel DataContext tulajdonsága az LoadedBooks adatszolgáltatóra van állítva.
DataContext="{Binding Source={StaticResource LoadedBooks}}
Az adatkörnyezet beállítása lehetővé teszi (a 46. sorban) a TextBlock nevű tbRawXml számára a nyers XML megjelenítését az adatszolgáltató Xml tulajdonságához kötéssel:
Text="{Binding Path=Xml}"
A Könyvlista ListBox felhasználói felület szakaszában, az 58-62. soroknál lévő beállítja a megjelenítési elemek sablonját az ablakerőforrás-szakaszban meghatározott BookTemplate-ra.
ItemTemplate ="{StaticResource BookTemplate}"
Ezután az 59–62. sorban a könyvek tényleges értékei ehhez a listamezőhöz vannak kötve:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
A harmadik felhasználói felületi szakasz ( Kijelölt könyv szerkesztése) először a szülő DataContextStackPanel-t a jelenleg kijelölt elemhez köti a Könyvlista felhasználói felület szakaszában (82. sor):
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Ezután kétirányú adatkötést használ, így a könyvelemek aktuális értékei megjelennek és frissülnek a panel két szövegmezőjében. A dinamikus tulajdonságokhoz való adatkötés hasonló a BookTemplate adatsablonban használt adatkötéshez:
Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"
Az utolsó felhasználói felületi szakasz, Új könyv hozzáadása, nem használ adatkötést az XAML-kódjában. Ehelyett az adatkötés a L2DBForm.xaml.csfájl eseménykezelési kódjában van.
példa
Leírás
Megjegyzés:
Javasoljuk, hogy másolja az alábbi kódot egy kódszerkesztőbe, például a Visual Studióban lévő C# forráskódszerkesztőbe, hogy a sorok száma könnyebben nyomon követhető legyen.
Kód
<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>
Megjegyzések
A WPF felhasználói felület elemeihez társított eseménykezelők C#-forráskódjához lásd L2DBForm.xaml.cs forráskód.
Lásd még
.NET Desktop feedback