Freigeben über


L2DBForm.xaml-Quellcode

Diese Seite enthält und beschreibt die XAML-Quelldatei für das WPF-Datenbindungsbeispielmithilfe von LINQ to XML.

Allgemeine UI-Struktur

Wie bei einem WPF-Projekt üblich, enthält diese Datei ein übergeordnetes Element, ein Window XML-Element, das der abgeleiteten Klasse L2XDBFrom im LinqToXmlDataBinding Namespace zugeordnet ist.

Der Clientbereich ist in einem StackPanel enthalten, der in einem hellblauen Hintergrund kodiert ist. Dieses Panel enthält vier DockPanel UI-Abschnitte, die durch Separator Balken getrennt sind. Der Zweck dieser Abschnitte wird hierbeschrieben.

Jeder Abschnitt enthält eine Bezeichnung, die ihn identifiziert. In den ersten beiden Abschnitten wird diese Beschriftung durch die Verwendung eines LayoutTransformum 90 Grad gedreht. Der Rest des Abschnitts enthält UI-Elemente, die dem Zweck dieses Abschnitts entsprechen, z. B. Textblöcke, Textfelder und Schaltflächen. Manchmal wird ein Kind-Steuerelement StackPanel verwendet, um diese untergeordneten Steuerelemente auszurichten.

Abschnitt der Fensterressourcen

Das öffnende <Window.Resources> Tag in Zeile 9 gibt den Anfang des Fensterressourcenabschnitts an. Es endet mit dem schließenden Tag auf Zeile 35.

Das <ObjectDataProvider>-Tag, das die Zeilen 11 bis 25 umfasst, deklariert eine ObjectDataProvidermit dem Namen LoadedBooks, die eine XElement als Quelle verwendet. Die XElement wird initialisiert, indem ein eingebettetes XML-Dokument (ein CDATA-Element) analysiert wird. Beachten Sie, dass Leerzeichen beim Deklarieren des eingebetteten XML-Dokuments und beim Analysieren beibehalten werden. Leerzeichen bleiben erhalten, da das Steuerelement TextBlock, das zum Anzeigen des rohen XML verwendet wird, keine speziellen XML-Formatierungsfunktionen aufweist.

Schließlich wird ein DataTemplate namens BookTemplate in den Zeilen 28 bis 34 definiert. Diese Vorlage wird verwendet, um die Einträge im Abschnitt Buchliste Benutzeroberfläche (UI) anzuzeigen. Es verwendet Datenbindung und die dynamischen Eigenschaften von "LINQ to XML", um die Buch-ID und den Buchnamen durch die folgenden Zuweisungen abzurufen:

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

Datenbindungscode

Zusätzlich zum DataTemplate-Element wird die Datenbindung an einer Reihe anderer Stellen in dieser Datei verwendet.

Im öffnenden <StackPanel>-Tag in Zeile 38 wird die DataContext-Eigenschaft dieses Bereichs auf den LoadedBooks-Datenanbieter festgelegt.

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

Das Festlegen des Datenkontexts ermöglicht es (in Zeile 46) TextBlock, die als tbRawXml bezeichnet wird, das rohe XML anzuzeigen, indem es an die Eigenschaft Xml dieses Datenanbieters gebunden wird.

Text="{Binding Path=Xml}"

Die ListBox im Abschnitt Buchliste Ui in den Zeilen 58 bis 62 legt die Vorlage für die Anzeigeelemente auf die im Fensterressourcenabschnitt definierten BookTemplate fest:

ItemTemplate ="{StaticResource BookTemplate}"

Dann werden in den Zeilen 59 bis 62 die tatsächlichen Werte der Bücher mit dieser Listbox verknüpft:

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

Der dritte Abschnitt der Benutzeroberfläche, Ausgewähltes Buch bearbeiten, bindet zuerst die DataContext des übergeordneten StackPanel an das aktuell ausgewählte Element in der UI-Sektion Buchliste (Zeile 82).

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

Anschließend wird eine bidirektionale Datenbindung verwendet, sodass die aktuellen Werte der Buchelemente in den beiden Textfeldern in diesem Bereich angezeigt und aus ihnen aktualisiert werden können. Die Datenbindung an dynamische Eigenschaften ähnelt der Datenbindung, die in der BookTemplate Datenvorlage verwendet wird:

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

Der letzte Abschnitt der Benutzeroberfläche, "Neues Buch hinzufügen", verwendet keine Datenbindung im XAML-Code. Stattdessen befindet sich die Datenbindung im Ereignisbehandlungscode in der Datei L2DBForm.xaml.cs.

Beispiel

Beschreibung

Anmerkung

Es wird empfohlen, den folgenden Code unten in einen Code-Editor zu kopieren, z. B. den C#-Quellcode-Editor in Visual Studio, damit Zeilennummern einfacher nachverfolgt werden können.

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>

Kommentare

Informationen zum C#-Quellcode für die Ereignishandler, die den WPF-UI-Elementen zugeordnet sind, finden Sie im Quellcode L2DBForm.xaml.cs.

Siehe auch