Condividi tramite


Codice sorgente di L2DBForm.xaml

Questa pagina contiene e descrive il file di origine XAML per il data binding WPF usando l'esempio LINQ to XML.

Struttura complessiva dell'interfaccia utente

Come in genere per un progetto WPF, questo file contiene un elemento padre, un Window elemento XML associato alla classe L2XDBFrom derivata nello spazio dei LinqToXmlDataBinding nomi .

L'area client è contenuta all'interno di un StackPanel oggetto a cui viene assegnato uno sfondo blu chiaro. Il pannello contiene quattro sezioni dell'interfaccia utente DockPanel separate da barre Separator . Lo scopo di queste sezioni è descritto qui.

Ogni sezione contiene un'etichetta che la identifica. Nelle prime due sezioni questa etichetta viene ruotata di 90 gradi tramite l'uso di un oggetto LayoutTransform. Il resto della sezione contiene elementi dell'interfaccia utente appropriati allo scopo di tale sezione, ad esempio blocchi di testo, caselle di testo e pulsanti. A volte viene usato un elemento figlio StackPanel per allineare questi controlli figlio.

Sezione delle risorse della finestra

Il tag di apertura di <Window.Resources> alla riga 9 indica l'inizio della sezione relativa alle risorse della finestra, che termina con il tag di chiusura alla riga 35.

Il tag <ObjectDataProvider> , che si estende dalla riga 11 alla riga 25, dichiara un oggetto ObjectDataProvider, denominato LoadedBooks, che usa XElement come origine. XElement viene inizializzato tramite l'analisi di un documento XML incorporato (elemento CDATA). Si noti che lo spazio vuoto viene mantenuto quando si dichiara il documento XML incorporato e anche quando viene analizzato. in quanto il controllo TextBlock, usato per visualizzare l'XML non elaborato, non include funzionalità speciali di formattazione XML.

Infine, viene definito un oggetto DataTemplate denominato BookTemplate dalla riga 28 alla riga 34. Questo modello viene usato per visualizzare le voci nella sezione dell'interfaccia utente Book List. Vengono usate l'associazione dati e le proprietà dinamiche di LINQ to XML per recuperare l'ID e il nome libro tramite le seguenti assegnazioni:

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

Codice di associazione dati

Oltre che nell'elemento DataTemplate , l'associazione dati viene usata in diverse altre sezioni del file.

Nel tag di apertura di <StackPanel> , alla riga 38, la proprietà DataContext di questo pannello è impostata sul provider di dati LoadedBooks .

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

L'impostazione del contesto di dati consente (alla riga 46) all'oggetto TextBlock denominato tbRawXml di visualizzare l'XML non elaborato tramite l'associazione alla proprietà Xml di questo provider di dati:

Text="{Binding Path=Xml}"

L'oggetto ListBox nella sezione dell'interfaccia utente Book List , dalla riga 58 alla riga 62, imposta il modello per i relativi elementi visualizzati sull'oggetto BookTemplate definito nella sezione delle risorse della finestra:

ItemTemplate ="{StaticResource BookTemplate}"

Quindi, dalla riga 59 alla riga 62, i valori effettivi dei libri vengono associati a questa casella di riepilogo:

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

La terza sezione dell'interfaccia utente, Edit Selected Book, associa l'oggetto DataContext dell'oggetto StackPanel padre all'elemento attualmente selezionato della sezione dell'interfaccia utente Book List (riga 82):

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

Usa quindi l'associazione dati bidirezionale, in modo che i valori correnti degli elementi libro vengano visualizzati e aggiornati dalle due caselle di testo di questo pannello. L'associazione dati a proprietà dinamiche è simile a quella usata nel modello di dati BookTemplate:

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

L'ultima sezione dell'interfaccia utente, Add New Book, non usa l'associazione dati nel codice XAML, ma l'associazione dati è invece disponibile nel codice di gestione degli eventi nel file L2DBForm.xaml.cs.

Esempio

Descrizione

Nota

Si consiglia di copiare il codice seguente in un editor di codice, ad esempio l'editor di codice sorgente C# in Visual Studio, in modo che sia più facile tenere traccia dei numeri di riga.

Codice

<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>

Commenti

Per il codice sorgente C# relativo ai gestori eventi associati agli elementi dell'interfaccia utente WPF, vedere L2DBForm.xaml.cs Source Code.

Vedi anche