Sdílet prostřednictvím


Jak zpřístupnit data pro vazbu v XAML

Toto téma popisuje různé způsoby zpřístupnění dat pro vazbu v jazyce XAML (Extensible Application Markup Language) v závislosti na potřebách vaší aplikace.

Příklad

Pokud máte objekt CLR (Common Language Runtime), se kterým chcete vytvořit vazbu z XAML, můžete objekt zpřístupnit pro vytvoření vazby tak, že ho definujete jako prostředek a dáte mu x:Key. V následujícím příkladu máte objekt Person s řetězcovou vlastností s názvem PersonName. Objekt Person (na řádku, který je zvýrazněný a obsahuje prvek <src>) je definován v oboru názvů 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>

Potom můžete svázat ovládací prvek TextBlock s objektem v XAML, jak ukazuje zvýrazněný řádek obsahující prvek <TextBlock>.

Alternativně můžete použít třídu ObjectDataProvider, jak je znázorněno v následujícím příkladu:

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

Vazbu definujete stejným způsobem jako zvýrazněný řádek, který obsahuje prvek <TextBlock>.

V tomto konkrétním příkladu je výsledek stejný: máte TextBlock s textovým obsahem Joe. Třída ObjectDataProvider však poskytuje funkce, jako je schopnost vytvořit vazbu na výsledek metody. Pokud potřebujete funkce, které poskytuje, můžete použít ObjectDataProvider třídu.

Pokud však vytváříte vazbu na objekt, který již byl vytvořen, musíte nastavit DataContext v kódu, jako v následujícím příkladu.

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

Pokud chcete získat přístup k datům XML pro vazbu pomocí třídy XmlDataProvider, podívejte se na téma Svázání dat XML pomocí XMLDataProvider a dotazů XPath. Přístup k datům XML pro vazbu pomocí třídy ObjectDataProvider naleznete v tématu Bind to XDocument, XElement nebo LINQ for XML Query Results.

Informace o mnoha způsobech, jak zadat data, ke které vytváříte vazbu, najdete v tématu Určení zdroje vazby. Informace o typech dat, se kterou můžete vytvořit vazbu nebo jak implementovat vlastní objekty CLR (Common Language Runtime) pro vazbu, najdete v tématu Přehled zdrojů vazeb.

Viz také