Kod źródłowy L2DBForm.xaml

Ta strona zawiera i opisuje plik źródłowy XAML dla powiązania danych WPF przy użyciu przykładu LINQ to XML.

Ogólna struktura interfejsu użytkownika

Jak zwykle w przypadku projektu WPF, ten plik zawiera jeden element nadrzędny, Window element XML skojarzony z klasą L2XDBFrom pochodną LinqToXmlDataBinding w przestrzeni nazw.

Obszar klienta znajduje się w obiekcie StackPanel , który ma jasnoniebieskie tło. Ten panel zawiera cztery DockPanel sekcje interfejsu użytkownika oddzielone Separator słupkami. W tym miejscu opisano przeznaczenie tych sekcji.

Każda sekcja zawiera etykietę, która ją identyfikuje. W dwóch pierwszych sekcjach ta etykieta jest obracana o 90 stopni przez użycie elementu LayoutTransform. Pozostała część sekcji zawiera elementy interfejsu użytkownika odpowiednie do celu tej sekcji, na przykład bloki tekstowe, pola tekstowe i przyciski. Czasami element podrzędny StackPanel jest używany do wyrównania tych kontrolek podrzędnych.

Sekcja zasobu okna

Tag otwierający <Window.Resources> w wierszu 9 wskazuje początek sekcji zasobu okna. Kończy się on tagiem zamykającym w wierszu 35.

Tag <ObjectDataProvider> , który obejmuje wiersze od 11 do 25, deklaruje ObjectDataProviderelement o nazwie LoadedBooks, który używa XElement elementu jako źródła. Element XElement jest inicjowany przez analizowanie osadzonego dokumentu XML ( CDATA elementu). Zwróć uwagę, że białe znaki są zachowywane podczas deklarowania osadzonego dokumentu XML, a także podczas analizowania. Białe znaki są zachowywane, ponieważ kontrolka TextBlock , która jest używana do wyświetlania nieprzetworzonego kodu XML, nie ma specjalnych możliwości formatowania XML.

Na koniec nazwa BookTemplate jest definiowana DataTemplate w wierszach od 28 do 34. Ten szablon służy do wyświetlania wpisów w sekcji Interfejs użytkownika listy książek . Używa powiązania danych i linQ to XML właściwości dynamicznych w celu pobrania identyfikatora książki i nazwy książki za pomocą następujących przypisań:

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

Kod powiązania danych

DataTemplate Oprócz elementu powiązanie danych jest używane w wielu innych miejscach w tym pliku.

W tagu otwierającym <StackPanel> w wierszu 38 DataContext właściwość tego panelu jest ustawiona na dostawcę LoadedBooks danych.

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

Ustawienie kontekstu danych umożliwia (w wierszu 46) TextBlock wyświetlanie tbRawXml nieprzetworzonego kodu XML przez powiązanie z właściwością tego dostawcy Xml danych:

Text="{Binding Path=Xml}"

W ListBox sekcji Interfejs użytkownika listy książek w wierszach od 58 do 62 ustawia szablon dla elementów wyświetlania do zdefiniowanej BookTemplate w sekcji zasobu okna:

ItemTemplate ="{StaticResource BookTemplate}"

Następnie w wierszach od 59 do 62 rzeczywiste wartości książek są powiązane z tym polem listy:

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

Trzecia sekcja interfejsu użytkownika, Edytuj wybraną książkę, najpierw wiąże DataContext element nadrzędny StackPanel z aktualnie wybranym elementem w sekcji Interfejs użytkownika listy książek (wiersz 82):

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

Następnie używa dwukierunkowego powiązania danych, aby bieżące wartości elementów książki były wyświetlane i aktualizowane z dwóch pól tekstowych w tym panelu. Powiązanie danych z właściwościami dynamicznymi jest podobne do powiązania danych używanego w szablonie BookTemplate danych:

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

Ostatnia sekcja interfejsu użytkownika, Dodawanie nowej książki, nie używa powiązania danych w kodzie XAML. Zamiast tego powiązanie danych znajduje się w kodzie obsługi zdarzeń w pliku L2DBForm.xaml.cs.

Przykład

opis

Uwaga

Zalecamy skopiowanie poniższego kodu do edytora kodu, takiego jak edytor kodu źródłowego języka C# w programie Visual Studio, dzięki czemu numery wierszy będą łatwiejsze do śledzenia.

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>

Komentarze

Aby uzyskać kod źródłowy języka C# dla programów obsługi zdarzeń skojarzonych z elementami interfejsu użytkownika WPF, zobacz kod źródłowy L2DBForm.xaml.cs.

Zobacz też