Sdílet prostřednictvím


Zdrojový kód L2DBForm.xaml

Tato stránka obsahuje a popisuje zdrojový soubor XAML pro datové vazby WPF pomocí LINQ to XML příklad.

Celková struktura uživatelského rozhraní

Jak je typické pro projekt WPF, tento soubor obsahuje jeden nadřazený prvek, Window XML element, který je přidružený k odvozené třídě L2XDBFrom v oboru názvů LinqToXmlDataBinding.

Oblast klienta je umístěna v prvku StackPanel, který má světle modré pozadí. Tento panel obsahuje čtyři oddíly uživatelského rozhraní DockPanel oddělené Separator pruhy. Účel těchto částí je popsán zde.

Každý oddíl obsahuje popisek, který ho identifikuje. V prvních dvou částech se tento štítek otočí o 90 stupňů pomocí LayoutTransform. Zbytek oddílu obsahuje prvky uživatelského rozhraní odpovídající účelu tohoto oddílu, například textové bloky, textová pole a tlačítka. Někdy se k zarovnání těchto ovládacích prvků používá dceřiná jednotka StackPanel.

Sekce zdroje okna

Počáteční značka <Window.Resources> na řádku 9 označuje začátek sekce prostředků okna. Končí koncovou značkou na řádku 35.

Značka <ObjectDataProvider>, která zahrnuje řádky 11 až 25, deklaruje ObjectDataProviders názvem LoadedBooks, která jako zdroj používá XElement. XElement se inicializuje parsováním vloženého dokumentu XML (elementu CDATA). Všimněte si, že bílé mezery se zachovají při deklarování vloženého dokumentu XML i při jeho analýze. Prázdné místo je zachováno, protože ovládací prvek TextBlock, který se používá k zobrazení nezpracovaného XML, nemá žádné speciální funkce formátování XML.

Nakonec je na řádcích 28 až 34 definována DataTemplate pojmenovaná BookTemplate. Tato šablona slouží k zobrazení položek v části Seznam knih uživatelské rozhraní. K načtení ID knihy a názvu knihy pomocí následujících přiřazení používá datové vazby a dynamické vlastnosti LINQ to XML:

Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"

Kód datové vazby

Kromě DataTemplate elementu se datová vazba používá v řadě dalších míst v tomto souboru.

V úvodní značce <StackPanel> na řádku 38 je vlastnost DataContext tohoto panelu nastavena na poskytovatele dat LoadedBooks.

DataContext="{Binding Source={StaticResource LoadedBooks}}

Nastavení datového kontextu umožňuje (na řádku 46) pro TextBlock s názvem tbRawXml zobrazit surový XML přenosem na vlastnost Xml tohoto poskytovatele dat:

Text="{Binding Path=Xml}"

ListBox v části Seznam knih uživatelské rozhraní na řádcích 58 až 62 nastaví šablonu pro její zobrazované položky na BookTemplate definované v oddílu prostředků okna:

ItemTemplate ="{StaticResource BookTemplate}"

Na řádcích 59 až 62 jsou pak skutečné hodnoty knih svázány s tímto seznamem:

<ListBox.ItemsSource>
    <Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>

Třetí část uživatelského rozhraní, Upravit vybranou knihu, nejprve propojí DataContext nadřazeného StackPanel na aktuálně vybranou položku v části uživatelského rozhraní Seznam knih (řádek 82):

DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"

Potom používá obousměrnou datovou vazbu, aby se aktuální hodnoty prvků knihy zobrazily a aktualizovaly ze dvou textových polí v tomto panelu. Datová vazba na dynamické vlastnosti se podobá datové vazbě použité v šabloně dat BookTemplate:

Text="{Binding Path=Attribute[id].Value}"...Text="{Binding Path=Value}"

Poslední část uživatelského rozhraní, Přidat novou knihu, nepoužívá datovou vazbu v kódu XAML. Místo toho je datová vazba v kódu zpracování událostí v souboru L2DBForm.xaml.cs.

Příklad

Popis

Poznámka

Následující kód doporučujeme zkopírovat do editoru kódu, například editor zdrojového kódu jazyka C#v sadě Visual Studio, aby se čísla řádků snadněji sledovala.

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>

Komentáře

Zdrojový kód jazyka C# pro obslužné rutiny událostí přidružené k prvkům uživatelského rozhraní WPF najdete v L2DBForm.xaml.cs.

Viz také