方法: バインディング ソースを指定するHow to: Specify the Binding Source

データ バインディングでは、バインド ソース オブジェクトとは、そこからデータを取得するオブジェクトを指します。In data binding, the binding source object refers to the object you obtain your data from. このトピックでは、バインド ソースを指定するさまざまな方法について説明します。This topic describes the different ways of specifying the binding source.

Example

複数のプロパティを共通ソースにバインドする場合は、DataContext を使用できます。これは、すべてのデータ バインド プロパティが共通ソースを継承するスコープを確立するための便利な方法です。If you are binding several properties to a common source, you want to use the DataContext property, which provides a convenient way to establish a scope within which all data-bound properties inherit a common source.

次の例では、アプリケーションのルート要素にデータ コンテキストが確立されます。In the following example, the data context is established on the root element of the application. これにより、すべての子要素がそのデータ コンテキストを継承することができます。This allows all child elements to inherit that data context. バインドするデータは、マッピングを通して直接参照され、リソース キー incomeDataSource が与えられるカスタム データ クラス NetIncome から取得されます。Data for the binding comes from a custom data class, NetIncome, referenced directly through a mapping and given the resource key of incomeDataSource.

<Grid
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.DirectionalBinding"
  xmlns:c="clr-namespace:SDKSample"
  Name="Page1"
>
  <Grid.Resources>
    <c:NetIncome x:Key="incomeDataSource"/>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="Padding" Value="8"/>
    </Style>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="Margin" Value="0,6,0,0"/>
    </Style>
  </Grid.Resources>
  <Grid.DataContext>
    <Binding Source="{StaticResource incomeDataSource}"/>
  </Grid.DataContext>
</Grid>

次の例は、NetIncome クラスの定義を示します。The following example shows the definition of the NetIncome class.

public class NetIncome : INotifyPropertyChanged
{
    private int totalIncome = 5000;
    private int rent = 2000;
    private int food = 0;
    private int misc = 0;
    private int savings = 0;
    public NetIncome()
    {
        savings = totalIncome - (rent+food+misc);
    }

    public int TotalIncome
    {
        get
        {
            return totalIncome;
        }
        set
        {
            if( TotalIncome != value)
            {
                totalIncome = value;
                OnPropertyChanged("TotalIncome");
            }
        }
    }
    public int Rent
    {
        get
        {
            return rent;
        }
        set
        {
            if( Rent != value)
            {
                rent = value;
                OnPropertyChanged("Rent");
                UpdateSavings();
            }
        }
    }
    public int Food
    {
        get
        {
            return food;
        }
        set
        {
            if( Food != value)
            {
                food = value;
                OnPropertyChanged("Food");
                UpdateSavings();
            }
        }
    }
    public int Misc
    {
        get
        {
            return misc;
        }
        set
        {
            if( Misc != value)
            {
                misc = value;
                OnPropertyChanged("Misc");
                UpdateSavings();
            }
        }
    }
    public int Savings
    {
        get
        {
            return savings;
        }
        set
        {
            if( Savings != value)
            {
                savings = value;
                OnPropertyChanged("Savings");
                UpdateSavings();
            }
        }
    }

    private void UpdateSavings()
    {
        Savings = TotalIncome - (Rent+Misc+Food);
        if(Savings < 0)
        {}
        else if(Savings >= 0)
        {}
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(String info)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler !=null)
        {
            handler(this, new PropertyChangedEventArgs(info));
        }
    }
}
Public Class NetIncome
    Implements INotifyPropertyChanged

    ' Events
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    ' Methods
    Public Sub New()
        Me._totalIncome = 5000
        Me._rent = 2000
        Me._food = 0
        Me._misc = 0
        Me._savings = 0
        Me._savings = (Me.TotalIncome - ((Me.Rent + Me.Food) + Me.Misc))
    End Sub

    Private Sub OnPropertyChanged(ByVal info As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    End Sub

    Private Sub UpdateSavings()
        Me.Savings = (Me.TotalIncome - ((Me.Rent + Me.Misc) + Me.Food))
        If ((Me.Savings >= 0) AndAlso (Me.Savings >= 0)) Then
        End If
    End Sub


    ' Properties
    Public Property Food As Integer
        Get
            Return Me._food
        End Get
        Set(ByVal value As Integer)
            If (Me.Food <> value) Then
                Me._food = value
                Me.OnPropertyChanged("Food")
                Me.UpdateSavings()
            End If
        End Set
    End Property

    Public Property Misc As Integer
        Get
            Return Me._misc
        End Get
        Set(ByVal value As Integer)
            If (Me.Misc <> value) Then
                Me._misc = value
                Me.OnPropertyChanged("Misc")
                Me.UpdateSavings()
            End If
        End Set
    End Property

    Public Property Rent As Integer
        Get
            Return Me._rent
        End Get
        Set(ByVal value As Integer)
            If (Me.Rent <> value) Then
                Me._rent = value
                Me.OnPropertyChanged("Rent")
                Me.UpdateSavings()
            End If
        End Set
    End Property

    Public Property Savings As Integer
        Get
            Return Me._savings
        End Get
        Set(ByVal value As Integer)
            If (Me.Savings <> value) Then
                Me._savings = value
                Me.OnPropertyChanged("Savings")
                Me.UpdateSavings()
            End If
        End Set
    End Property

    Public Property TotalIncome As Integer
        Get
            Return Me._totalIncome
        End Get
        Set(ByVal value As Integer)
            If (Me.TotalIncome <> value) Then
                Me._totalIncome = value
                Me.OnPropertyChanged("TotalIncome")
            End If
        End Set
    End Property


    ' Fields
    Private _food As Integer
    Private _misc As Integer
    Private _rent As Integer
    Private _savings As Integer
    Private _totalIncome As Integer
End Class

注意

上記の例では、マークアップ内のオブジェクトをインスタンス化し、それをリソースとして使用しています。The above example instantiates the object in markup and uses it as a resource. コードで既にインスタンス化されているオブジェクトにバインドする場合は、DataContext プロパティをプログラムで設定する必要があります。If you want to bind to an object that has already been instantiated in code, you need to set the DataContext property programmatically. 例については、「方法: XAML でデータをバインディング可能にする」を参照してください。For an example, see Make Data Available for Binding in XAML.

個々のバインドでソースを明示的に指定する場合は、次のオプションを使用できます。Alternatively, if you want to specify the source on your individual bindings explicitly, you have the following options. これらは、継承されたデータ コンテキストに優先します。These take precedence over the inherited data context.

プロパティProperty 説明Description
Source オブジェクトのインスタンスにソースを設定するには、このプロパティを使用します。You use this property to set the source to an instance of an object. スコープを確立するの機能を必要としない場合、同じデータ コンテキストを継承するいくつかのプロパティを使用できます、Sourceプロパティの代わりに、DataContextプロパティ。If you do not need the functionality of establishing a scope in which several properties inherit the same data context, you can use the Source property instead of the DataContext property. 詳細については、「 Source 」を参照してください。For more information, see Source.
RelativeSource これは、バインディング ターゲットの場所を基準としてソースを指定する場合に便利です。This is useful when you want to specify the source relative to where your binding target is. このプロパティを使用できる一般的なシナリオとして、要素の 1 つのプロパティを同じ要素の別のプロパティにバインドする場合や、スタイルまたはテンプレート内のバインドを定義する場合があります。Some common scenarios where you may use this property is when you want to bind one property of your element to another property of the same element or if you are defining a binding in a style or a template. 詳細については、「 RelativeSource 」を参照してください。For more information, see RelativeSource.
ElementName バインド先の要素を表す文字列を指定します。You specify a string that represents the element you want to bind to. これは、アプリケーションの別の要素のプロパティにバインドする場合に便利です。This is useful when you want to bind to the property of another element on your application. 使用する場合など、Sliderアプリケーションでは、別のコントロールの高さを制御するためにバインドする場合、または、 Content 、コントロールをSelectedValueのプロパティ、ListBoxコントロール。For example, if you want to use a Slider to control the height of another control in your application, or if you want to bind the Content of your control to the SelectedValue property of your ListBox control. 詳細については、「 ElementName 」を参照してください。For more information, see ElementName.

関連項目See also