Gewusst wie: Bereitstellen von Daten, um diese in XAML zu binden

In diesem Thema werden verschiedene Möglichkeiten erläutert, wie Sie Daten für die Bindung in Extensible Application Markup Language (XAML) abhängig von den Anforderungen Ihrer Anwendung verfügbar machen können.

Beispiel

Wenn Sie ein Common Language Runtime (CLR)-Objekt haben, an das Sie von XAML aus binden möchten, können Sie das Objekt als Ressource definieren und ihm eine x:Key geben. Im folgenden Beispiel haben Sie ein Person-Objekt mit einer Zeichenfolgeneigenschaft namens PersonName. Das Person-Objekt (in der hervorgehobenen Zeile, die das <src>-Element enthält) wird im Namespace definiert, der aufgerufen SDKSample wird.

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

Anschließend können Sie das TextBlock-Steuerelement an das Objekt in XAML binden, da die hervorgehobene Zeile, die das <TextBlock>-Element enthält, angezeigt wird.

Alternativ können Sie auch die ObjectDataProvider-Klasse verwenden, wie im folgenden Beispiel:

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

Sie definieren die Bindung auf die gleiche Weise wie die hervorgehobene Zeile, die das <TextBlock>-Element enthält.

In diesem speziellen Beispiel ist das Ergebnis dasselbe: Sie haben ein TextBlock mit dem Textinhalt Joe. Die ObjectDataProvider-Klasse stellt jedoch Funktionen bereit, z. B. die Möglichkeit, an das Ergebnis einer Methode zu binden. Sie können die ObjectDataProvider-Klasse verwenden, wenn Sie die bereitgestellte Funktionalität benötigen.

Wenn Sie jedoch an ein bereits erstelltes Objekt binden, müssen Sie den DataContext-Code wie im folgenden Beispiel festlegen.

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

Informationen zum Zugreifen auf XML-Daten für die Bindung mithilfe der XmlDataProvider-Klasse finden Sie unter Binden an XML-Daten mithilfe eines XMLDataProvider- und XPath-Abfragens. Informationen zum Zugreifen auf XML-Daten für die Bindung mithilfe der ObjectDataProvider-Klasse finden Sie unter "Binden an XDocument", "XElement" oder "LINQ für XML-Abfrageergebnisse".

Informationen zu vielen Möglichkeiten, mit denen Sie die Daten angeben können, an die Sie binden, finden Sie unter Angeben der Bindungsquelle. Informationen zu den Datentypen, an die Sie binden können, oder wie Sie Ihre eigenen CLR-Objekte (Common Language Runtime) für die Bindung implementieren können, finden Sie unter Übersicht über Bindungsquellen.

Weitere Informationen