Como: Disponibilizar dados para vinculação em XAML
Este tópico discute várias maneiras de disponibilizar dados para vinculação em Extensible Application Markup Language (XAML), dependendo das necessidades do seu aplicativo.
Exemplo
Se você tiver um objeto CLR (Common Language Runtime) ao qual gostaria de se vincular a partir de XAML, uma maneira de disponibilizar o objeto para vinculação é defini-lo como um recurso e dar-lhe uma x:Key
. No exemplo a seguir, você tem um objeto Person
com uma propriedade string chamada PersonName
. O objeto Person
(na linha mostrada realçada que contém o elemento <src>
) é definido no namespace chamado SDKSample
.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:SDKSample"
SizeToContent="WidthAndHeight"
Title="Simple Data Binding Sample">
<Window.Resources>
<src:Person x:Key="myDataSource" PersonName="Joe"/>
<Style TargetType="{x:Type Label}">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="25"/>
<Setter Property="DockPanel.Dock" Value="Top"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="25"/>
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Padding" Value="3"/>
</Style>
</Window.Resources>
<Border Margin="5" BorderBrush="Aqua" BorderThickness="1" Padding="8" CornerRadius="3">
<DockPanel Width="200" Height="100" Margin="35">
<Label>Enter a Name:</Label>
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource myDataSource}" Path="PersonName"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<Label>The name you entered:</Label>
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
</DockPanel>
</Border>
</Window>
Em seguida, você pode vincular o controle TextBlock ao objeto em XAML, como mostra a linha realçada que contém o elemento <TextBlock>
.
Como alternativa, você pode usar a classe ObjectDataProvider, como no exemplo a seguir:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:SDKSample"
xmlns:system="clr-namespace:System;assembly=mscorlib"
SizeToContent="WidthAndHeight"
Title="Simple Data Binding Sample">
<Window.Resources>
<ObjectDataProvider x:Key="myDataSource" ObjectType="{x:Type src:Person}">
<ObjectDataProvider.ConstructorParameters>
<system:String>Joe</system:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
<Style TargetType="{x:Type Label}">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="FontSize" Value="12"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="25"/>
<Setter Property="DockPanel.Dock" Value="Top"/>
</Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="25"/>
<Setter Property="DockPanel.Dock" Value="Top"/>
</Style>
</Window.Resources>
<Border Margin="25" BorderBrush="Aqua" BorderThickness="3" Padding="8">
<DockPanel Width="200" Height="100">
<Label>Enter a Name:</Label>
<TextBox>
<TextBox.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"
UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>
</TextBox>
<Label>The name you entered:</Label>
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
</DockPanel>
</Border>
</Window>
Você define a associação da mesma maneira, como mostra a linha realçada que contém o elemento <TextBlock>
.
Neste exemplo em particular, o resultado é o mesmo: temos um TextBlock com o conteúdo do texto Joe
. No entanto, a classe ObjectDataProvider fornece funcionalidades como a capacidade de ligar ao resultado de um método. Você pode optar por usar a classe ObjectDataProvider se precisar da funcionalidade que ela fornece.
No entanto, se você estiver vinculando a um objeto que já foi criado, precisará definir o DataContext
no código, como no exemplo a seguir.
DataSet myDataSet;
private void OnInit(object sender, EventArgs e)
{
string mdbFile = Path.Combine(AppDataPath, "BookData.mdb");
string connString = string.Format(
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", mdbFile);
OleDbConnection conn = new OleDbConnection(connString);
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM BookTable;", conn);
myDataSet = new DataSet();
adapter.Fill(myDataSet, "BookTable");
// myListBox is a ListBox control.
// Set the DataContext of the ListBox to myDataSet
myListBox.DataContext = myDataSet;
}
Private myDataSet As DataSet
Private Sub OnInit(ByVal sender As Object, ByVal e As EventArgs)
Dim mdbFile As String = Path.Combine(AppDataPath, "BookData.mdb")
Dim connString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", mdbFile)
Dim conn As New OleDbConnection(connString)
Dim adapter As New OleDbDataAdapter("SELECT * FROM BookTable;", conn)
myDataSet = New DataSet()
adapter.Fill(myDataSet, "BookTable")
' myListBox is a ListBox control.
' Set the DataContext of the ListBox to myDataSet
myListBox.DataContext = myDataSet
End Sub
Para aceder a dados XML para vinculação usando a classe XmlDataProvider, consulte Associar a Dados XML Usando um XMLDataProvider e Consultas XPath. Para acessar dados XML para vinculação usando a classe ObjectDataProvider, consulte Bind to XDocument, XElement ou LINQ for XML Query Results.
Para obter informações sobre várias maneiras de especificar os dados aos quais você está vinculando, consulte Especificar a origem da vinculação. Para obter informações sobre os tipos de dados aos quais você pode vincular ou como implementar seus próprios objetos CLR (Common Language Runtime) para vinculação, consulte Binding Sources Overview.
Ver também
- Visão geral da vinculação de dados
- Tópicos de instruções
.NET Desktop feedback