Comment : rendre des données disponibles pour la liaison en XAML

Cette rubrique décrit différentes façons de rendre les données disponibles pour la liaison dans XAML (Extensible Application Markup Language), en fonction des besoins de votre application.

Exemple

Si vous avez un objet CLR (Common Language Runtime) auquel vous souhaitez établir une liaison à partir de XAML, vous pouvez rendre l’objet disponible pour la liaison consiste à le définir comme une ressource et à lui donner un x:Key. Dans l’exemple suivant, vous avez un Person objet avec une propriété de chaîne nommée PersonName. L’objet Person (dans la ligne affichée en surbrillance qui contient l’élément <src> ) est défini dans l’espace de noms appelé 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>

Vous pouvez ensuite lier le TextBlock contrôle à l’objet en XAML, comme la ligne en surbrillance qui contient l’élément <TextBlock> affiché.

Vous pouvez également utiliser la ObjectDataProvider classe, comme dans l’exemple suivant :

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

Vous définissez la liaison de la même façon que la ligne mise en surbrillance qui contient l’élément <TextBlock> affiché.

Dans cet exemple particulier, le résultat est le même : vous avez un TextBlock contenu Joetexte . Toutefois, la ObjectDataProvider classe fournit des fonctionnalités telles que la possibilité de lier au résultat d’une méthode. Vous pouvez choisir d’utiliser la ObjectDataProvider classe si vous avez besoin des fonctionnalités qu’elle fournit.

Toutefois, si vous établissez une liaison à un objet qui a déjà été créé, vous devez définir le DataContext code dans l’exemple suivant.

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

Pour accéder aux données XML pour la liaison à l’aide de la XmlDataProvider classe, consultez Bind to XML Data Using an XMLDataProvider and XPath Queries. Pour accéder aux données XML pour la liaison à l’aide de la ObjectDataProvider classe, consultez Bind to XDocument, XElement ou LINQ for XML Query Results.

Pour plus d’informations sur de nombreuses façons de spécifier les données à laquelle vous effectuez une liaison, consultez Spécifier la source de liaison. Pour plus d’informations sur les types de données auxquels vous pouvez vous lier ou comment implémenter vos propres objets CLR (Common Language Runtime) pour la liaison, consultez La vue d’ensemble des sources de liaison.

Voir aussi