Código fonte L2DBForm.xaml
Esta página contém e descreve o arquivo de origem XAML para a associação de dados WPF usando o exemplo LINQ to XML.
Estrutura geral da interface do usuário
Como é típico para um projeto WPF, esse arquivo contém um elemento pai, um elemento XML Window associado ao L2XDBFrom
de classe derivado no namespace LinqToXmlDataBinding
.
A área do cliente está contida dentro de um StackPanel que recebe um fundo azul claro. Este painel contém quatro seções DockPanel da interface do usuário separadas por barras Separator. O objetivo destas seções é descrito aqui.
Cada secção contém uma etiqueta que a identifica. Nas duas primeiras seções, este rótulo é girado 90 graus utilizando um LayoutTransform. O restante da seção contém elementos da interface do usuário apropriados para a finalidade dessa seção, por exemplo, blocos de texto, caixas de texto e botões. Às vezes, uma criança StackPanel é usada para alinhar estes controlos subordinados.
Seção de recursos da janela
A tag <Window.Resources>
de abertura na linha 9 indica o início da seção de recursos da janela. Termina com a etiqueta de fecho na linha 35.
A tag <ObjectDataProvider>
, que abrange as linhas 11 a 25, declara uma ObjectDataProvider, chamada LoadedBooks
, que usa um XElement como origem. O XElement é inicializado analisando um documento XML incorporado (um elemento CDATA
). Observe que o espaço em branco é preservado ao declarar o documento XML incorporado 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, uma DataTemplate chamada BookTemplate
é definida nas linhas 28 a 34. Este modelo é usado para exibir as entradas na seção Lista de livros interface do usuário. Ele usa a vinculação de dados e as propriedades dinâmicas LINQ to XML para recuperar o ID do livro e o nome do livro por meio das seguintes atribuições:
Text="{Binding Path=Attribute[id].Value}"Text="{Binding Path=Value}"
Código de vinculação de dados
Além do elemento DataTemplate, a vinculação de dados é usada em vários outros locais neste arquivo.
Na tag <StackPanel>
na linha 38, a propriedade DataContext do painel é atribuída ao provedor de dados LoadedBooks
.
DataContext="{Binding Source={StaticResource LoadedBooks}}
A definição do contexto de dados possibilita (na linha 46) que o TextBlock chamado tbRawXml
exiba o XML bruto vinculando-se à propriedade Xml
deste provedor de dados:
Text="{Binding Path=Xml}"
O ListBox na secção de Interface de Utilizador da Lista de Livros , nas linhas 58 a 62, define o modelo dos seus itens de exibição como o BookTemplate
, conforme definido na secção de recursos da janela:
ItemTemplate ="{StaticResource BookTemplate}"
Em seguida, nas linhas 59 a 62, os valores reais dos livros estão vinculados a esta caixa de listagem:
<ListBox.ItemsSource>
<Binding Path="Elements[{http://www.mybooks.com}book]"/>
</ListBox.ItemsSource>
A terceira secção da interface de utilizador, Editar Livro Selecionado, começa por vincular o DataContext do elemento principal StackPanel ao item atualmente selecionado na secção da lista de livros da interface de utilizador (linha 82):
DataContext="{Binding ElementName=lbBooks, Path=SelectedItem}"
Em seguida, ele usa a vinculação de dados bidirecional, para que os valores atuais dos elementos do livro sejam exibidos e atualizados a partir das duas caixas de texto neste painel. 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, Adicionar Novo Livro, não usa a associação de dados em seu código XAML. Em vez disso, a vinculação de dados está no seu código de manipulação de eventos no arquivo L2DBForm.xaml.cs.
Exemplo
Descrição
Observação
Recomendamos que você copie o código abaixo 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>
Observações
Para obter o código-fonte C# para os manipuladores de eventos associados aos elementos da interface do usuário do WPF, consulte L2DBForm.xaml.cs código-fonte.
Ver também
.NET Desktop feedback