Compartilhar via


Código-fonte L2DBForm.xaml

Esta página contém e descreve o arquivo de origem XAML para vinculação de dados WPF usando o exemplo LINQ to XML.

Estrutura geral da interface do usuário

Como é típico para um projeto do WPF, esse arquivo contém um elemento pai, um elemento XML Window associado à classe derivada L2XDBFrom no namespace LinqToXmlDataBinding.

A área do cliente está contida em um StackPanel que recebe uma tela de fundo azul clara. Este painel contém quatro seções de interface do usuário DockPanel separadas por barras de Separator. A finalidade dessas seções é descrita aqui.

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

Seção de recursos da 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, chamado LoadedBooks, que usa XElement como a fonte. O XElement é inicializado analisando um documento XML inserido (um elemento CDATA). Observe que o espaço em branco é preservado ao declarar o documento XML inserido e também quando ele é analisado. O espaço em branco é preservado porque o controle TextBlock, que é usado para exibir o XML bruto, não tem recursos especiais de formatação XML.

Por fim, um DataTemplate chamado BookTemplate é definido nas linhas 28 a 34. Este modelo é usado para exibir as entradas na seção de interface do usuário da Lista de Livros. 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 DataTemplate, a associação de dados é usada em vários 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}}

Definir o contexto de dados torna possível (na linha 46) para o TextBlock nomeado tbRawXml exibir o XML bruto associando-se à propriedade Xml desse provedor de dados:

Text="{Binding Path=Xml}"

O ListBox na seção da interface do usuário Lista de Livros, nas linhas 58 a 62, define o modelo para os respectivos itens de exibição como o BookTemplate definido na seção de recursos de janela:

ItemTemplate ="{StaticResource BookTemplate}"

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

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

A terceira seção da interface do usuário, Editar Livro Selecionado, primeiro associa o DataContext do StackPanel pai ao item que está selecionado no momento na seção da interface do usuário Lista de Livros (linha 82):

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

Em seguida, ele usa a associação de dados bidirecional, para que os valores atuais dos elementos do livro sejam exibidos nas duas caixas de texto deste painel e atualizados a partir delas. A associação de dados a propriedades dinâmicas é semelhante à associação de dados usada no modelo de dados BookTemplate:

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

A última seção da interface do usuário, Add New Book, não usa associação de dados em seu código XAML. Em vez disso, a associação de dados está em seu código de tratamento de eventos no arquivo L2DBForm.xaml.cs.

Exemplo

Descrição

Observação

Recomendamos que você copie o código a seguir em um editor de código, como o editor de código-fonte C# no Visual Studio, para que os números de linha sejam mais fáceis de rastrear.

Código

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

Comentários

Para obter o código-fonte C# dos manipuladores de eventos associados aos elementos da interface do usuário do WPF, consulte o arquivo L2DBForm.xaml.cs.

Consulte também