Partilhar via


Código-fonte de L2DBForm.xaml

Este tópico contém e descreve o arquivo de origem para Associação de dados de WPF usando LINQ te o exemplo de XML, L2DBForm.xaml XAML.

Estrutura geral de interface de usuário

Como típico é para um projeto de WPF, esse arquivo contém um elemento pai, um elemento XML Window associado com a classe derivada L2XDBFrom no espaço de LinqToXmlDataBinding .

A área cliente está contida dentro de StackPanel que recebe um plano de fundo azul. Esse painel contém quatro seções de DockPanel interface do usuário separados por barras de Separator . O objetivo dessas seções é descrita em Observações em tópico anterior.

Cada seção contém um rótulo que a identifica. Nas duas primeiras seções, este rótulo é girada em 90 graus com o uso de LayoutTransform. O restante da seção contém os elementos de interface do usuário apropriados para a finalidade dessa seção: blocos de texto, caixas de texto, botões, e assim por diante. Um filho StackPanel são às vezes para alinhar esses controles filho.

Seção de recursos de janela

A marca de abertura <Window.Resources> na linha 9 indica o início da seção de recursos da janela. Termina com a marca de fechamento na linha 35.

A marca de <ObjectDataProvider> , que abrange as linhas 11 a 25, declara ObjectDataProvider, LoadedBookschamado, que usa XElement como a fonte. Este XElement é inicializado analisar um documento XML inserido (um elemento de CDATA ). Observe que o espaço em branco é preservada quando declarar o documento XML inserido e também quando é analisado. Isso foi feito como o controle de TextBlock , que é usado para exibir XML brutos, não tem XML especial que formata recursos.

Finalmente, DataTemplate chamado BookTemplate é definido em linhas 28 a 34. Este modelo será usado para exibir as entradas na seção de Lista de livros interface do usuário. Usa associação de dados e propriedades dinâmicas LINQ to XML para recuperar a identificação do livro e o nome de livro com as atribuições seguintes:

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

Código de associação de dados

Além do elemento de DataTemplate , associação de dados é usada em um número de outros locais neste arquivo.

Na marca de abertura <StackPanel> na linha 38, a propriedade de DataContext desse painel é definida para o provedor de dados de LoadedBooks .

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

Isso torna possível na linha (46) para TextBlock chamado tbRawXml para exibir XML brutos associando a propriedade de Xml deste provedor de dados:

Text="{Binding Path=Xml}" 

ListBox na seção de Lista de livros interface do usuário, linhas 58 a 62, defina o modelo para seus itens de exibição a BookTemplate definidos na seção de recursos a janela:

ItemTemplate ="{StaticResource BookTemplate}" 

Em seguida, linhas 59 a 62, os valores reais dos livros são associados à caixa de listagem:

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

A terceira seção de interface do usuário, Livro selecionado edição, associa primeiro DataContext de StackPanel pai para o item atualmente selecionado dentro da seção de Lista de livros interface do usuário (linha 82):

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

Ele usa a associação de dados bidirecional, para que os valores atuais dos elementos de livro são exibidos para e atualizados das duas caixas de texto nesse o painel. Associação de dados às propriedades dinâmicas são semelhantes ao usado no modelo de dados de BookTemplate :

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

A seção a mais recente de interface do usuário, Adicionar o novo livro, não usa associação de dados no seu código XAML; em vez disso, esse código pode ser encontrado no seu código de manipulação de eventos no arquivo L2DBForm.xaml.cs.

Exemplo

Descrição

Dica

Recomendamos que você copie o seguinte código abaixo em um editor de códigos, como o editor de código-fonte C# no Visual Studio, de modo que a linha números é mais fácil de controlar.

Código

<Window x:Class="LinqToXmlDataBinding.L2XDBForm"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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>

Comentários

Para o código-fonte de C# para os manipuladores de eventos associados com os elementos de interface do usuário WPF, consulte Código-fonte de L2DBForm.xaml.cs.

Consulte também

Tarefas

Passo a passo: Exemplo de LinqToXmlDataBinding

Código-fonte de L2DBForm.xaml.cs