Zdrojový kód L2DBForm.xaml

Tato stránka obsahuje a popisuje zdrojový soubor XAML pro datovou vazbu WPF pomocí příkladu LINQ to XML.

Celková struktura uživatelského rozhraní

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

Klientská oblast je obsažená v StackPanel světle modrém pozadí. Tento panel obsahuje čtyři DockPanel části uživatelského rozhraní oddělené Separator pruhy. Účel těchto částí je zde popsaný.

Každý oddíl obsahuje popisek, který ho identifikuje. V prvních dvou částech se tento popisek 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 podřízené StackPanel ovládací prvky používají k zarovnání těchto podřízených ovládacích prvků.

Oddíl zdroje okna

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

Značka<ObjectDataProvider>, která zahrnuje řádky 11 až 25, deklaruje pojmenovanou ObjectDataProviderLoadedBooks, která používá jako XElement zdroj. Inicializuje se XElement parsováním vloženého dokumentu XML (elementu CDATA ). Všimněte si, že při deklarování vloženého dokumentu XML a při analýze se zachovají prázdné znaky. Prázdné znaky se zachovají, protože TextBlock ovládací prvek, který se používá k zobrazení nezpracovaného XML, nemá žádné speciální možnosti formátování XML.

Nakonec je pojmenovaný DataTemplateBookTemplate definován na řádcích 28 až 34. Tato šablona slouží k zobrazení položek v uživatelském rozhraní seznamu knih. 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ě elementu DataTemplate se datová vazba používá v řadě dalších míst v tomto souboru.

Na úvodní <StackPanel> značce na řádku 38 DataContext je vlastnost tohoto panelu nastavená LoadedBooks na zprostředkovatele dat.

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

Nastavení kontextu dat umožňuje (na řádku 46) zobrazit TextBlocktbRawXml nezpracovaný XML vazbou na vlastnost tohoto zprostředkovatele Xml dat:

Text="{Binding Path=Xml}"

V ListBox části Uživatelské rozhraní seznamu knih na řádcích 58 až 62 nastaví šablonu pro její zobrazené položky na BookTemplate definovaný v části zdroje 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í Edit Selected Book (Upravit vybranou knihu) nejprve sváže DataContext nadřazenou StackPanel položku s aktuálně vybranou položkou z oddílu uživatelského rozhraní seznamu 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 BookTemplate šabloně dat:

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

V poslední části uživatelského rozhraní Add New Book (Přidat novou knihu) se v kódu XAML nepoužívá datová vazba. 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 naleznete ve zdrojovém kódu L2DBForm.xaml.cs.

Viz také