方法: XAML でデータをバインディング可能にするHow to: Make Data Available for Binding in XAML

このトピックでは、アプリケーションのニーズに応じて、でExtensible Application Markup Language (XAML)Extensible Application Markup Language (XAML)データをバインドできるようにするさまざまな方法について説明します。This topic discusses various ways you can make data available for binding in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), depending on the needs of your application.

Example

バインドXAMLXAML先の共通言語ランタイム (CLR) オブジェクトがある場合は、そのオブジェクトをリソースとして定義し、 x:Keyそれをに設定する方法の1つです。If you have a common language runtime (CLR) object you would like to bind to from XAMLXAML, one way you can make the object available for binding is to define it as a resource and give it an x:Key. 次の例では、というPerson名前PersonNameの文字列プロパティを持つオブジェクトがあります。In the following example, you have a Person object with a string property named PersonName. オブジェクト (要素を<src>含む強調表示されている行) は、というSDKSample名前空間で定義されています。 PersonThe Person object (in the line shown highlighted that contains the <src> element) is defined in the namespace called 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 <TextBlock>要素を含む強調表示されXAMLXAMLた行に示されているように、コントロールをのオブジェクトにバインドできます。You can then bind the TextBlock control to the object in XAMLXAML, as the highlighted line that contains the <TextBlock> element shows.

または、次の例ObjectDataProviderのように、クラスを使用することもできます。Alternatively, you can use the ObjectDataProvider class, as in the following example:

<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>要素を含む強調表示された行が示すように、同じ方法で定義します。You define the binding the same way, as the highlighted line that contains the <TextBlock> element shows.

この例では、結果は同じです。テキストコンテンツTextBlock Joeを含むがあります。In this particular example, the result is the same: you have a TextBlock with the text content Joe. ただし、クラスObjectDataProviderには、メソッドの結果にバインドする機能などの機能が用意されています。However, the ObjectDataProvider class provides functionality such as the ability to bind to the result of a method. 提供される機能が必要ObjectDataProviderな場合は、クラスを使用することを選択できます。You can choose to use the ObjectDataProvider class if you need the functionality it provides.

ただし、既に作成されているオブジェクトにバインドする場合は、次の例にDataContext示すように、コードでを設定する必要があります。However, if you are binding to an object that has already been created, you need to set the DataContext in code, as in the following example.

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

クラスを使用してバインドするデータにアクセスXMLXMLするには、「 xmldataprovider と XPath クエリを使用して XML データにバインドする」を参照してください。 XmlDataProviderTo access XMLXML data for binding using the XmlDataProvider class, see Bind to XML Data Using an XMLDataProvider and XPath Queries. クラスを使用してバインドするデータにアクセスXMLXMLするには、「 XDocument、XElement、または LINQ for XML のクエリ結果へのバインド」を参照してください。 ObjectDataProviderTo access XMLXML data for binding using the ObjectDataProvider class, see Bind to XDocument, XElement, or LINQ for XML Query Results.

バインド先のデータを指定するさまざまな方法の詳細については、「バインディングソースを指定する」を参照してください。For information about many ways you can specify the data you are binding to, see Specify the Binding Source. バインドできるデータの種類や、独自の共通言語ランタイム (CLR) オブジェクトをバインド用に実装する方法の詳細については、「バインディングソースの概要」を参照してください。For information about what types of data you can bind to or how to implement your own common language runtime (CLR) objects for binding, see Binding Sources Overview.

関連項目See also