방법: XAML의 바인딩에 사용할 수 있는 데이터 만들기

이 항목에서는 애플리케이션의 요구 사항에 따라 XAML(Extensible Application Markup Language 바인딩에 데이터를 사용할 수 있도록 하는 다양한 방법에 대해 설명합니다.

예제

XAML에서 바인딩하려는 CLR(공용 언어 런타임) 개체가 있는 경우 개체를 바인딩에 사용할 수 있도록 하는 한 가지 방법은 리소스로 정의하고 을 제공하는 x:Key 것입니다. 다음 예제에서는 Person 라는 문자열 속성을 가진 개체가 PersonName 있습니다. Person요소를 포함하는 강조 표시된 줄의 <src> 개체는 라는 네임스페이스에 정의됩니다. 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>

그런 다음 TextBlock 컨트롤을 XAML의 개체에 요소를 포함하는 강조 표시된 줄에 바인딩할 수 <TextBlock> 있습니다.

또는 ObjectDataProvider 다음 예제와 같이 클래스를 사용할 수 있습니다.

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

요소가 포함된 강조 표시된 줄과 동일한 방식으로 바인딩을 <TextBlock> 정의합니다.

이 특정 예제에서 결과는 동일합니다. 텍스트 TextBlock 내용이 인 가 Joe 있습니다. 그러나 ObjectDataProvider 클래스는 메서드의 결과에 바인딩하는 기능과 같은 기능을 제공합니다. 클래스에서 제공하는 기능이 필요한 경우 클래스를 사용하도록 선택할 수 ObjectDataProvider 있습니다.

그러나 이미 만들어진 개체에 바인딩하는 경우 다음 예제와 같이 코드에서 를 설정해야 DataContext 합니다.

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

클래스를 사용하여 바인딩할 XML 데이터에 액세스하려면 XmlDataProviderXmlDataProvider 클래스를 사용하여 바인딩할 XML 데이터에 액세스하려면 ObjectDataProviderObjectDataProvider

바인딩할 데이터를 지정할 수 있는 다양한 방법에 대한 자세한 내용은 바인딩 소스 지정을 참조하세요. 바인딩할 수 있는 데이터 형식 또는 바인딩을 위해 고유한 CLR(공용 언어 런타임) 개체를 구현하는 방법에 대한 자세한 내용은 바인딩 소스 개요를참조하세요.

참조