在数据绑定中,绑定源对象是指从其获取数据的对象。 本主题描述了指定绑定源的不同方法。

如果要将几个属性绑定到一个通用源,则需要使用 DataContext 属性,它能让你方便地建立一个范围,所有数据绑定的属性都在该范围中继承通用源。

在下面的示例中,数据上下文建立在应用程序的根元素上。 这允许所有子元素继承该数据上下文。 绑定的数据来自自定义数据类 NetIncome ,可通过映射直接引用该类,已为该类分配了 incomeDataSource 资源键。

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 类的定义。

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
            return totalIncome;
            if( TotalIncome != value)
                totalIncome = value;
                OnPropertyChanged("TotalIncome");
    public int Rent
            return rent;
            if( Rent != value)
                rent = value;
                OnPropertyChanged("Rent");
                UpdateSavings();
    public int Food
            return food;
            if( Food != value)
                food = value;
                OnPropertyChanged("Food");
                UpdateSavings();
    public int Misc
            return misc;
            if( Misc != value)
                misc = value;
                OnPropertyChanged("Misc");
                UpdateSavings();
    public int Savings
            return savings;
            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
            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
            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
            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
            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
            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

以上示例实例化标记中的对象,并将其用作资源。 如果希望绑定到已在代码中实例化的对象,需要通过编程方式设置 DataContext 属性。 有关示例,请参阅使数据可用于 XAML 中的绑定

另外,如果希望在个别绑定上显式指定源,可以选择以下选项。 这些选项优先于继承的数据上下文。

properties Source 使用此属性将源设置为对象的实例。 如果不需要建立范围(在此范围内若干属性继承同一数据上下文)的功能,可以使用 Source 属性,而不是 DataContext 属性。 有关详细信息,请参阅 SourceRelativeSource 当希望指定相对于绑定目标位置的源时,这很有用。 当想要将元素的一个属性绑定到同一元素的另一个属性时,或者如果要在样式或模板中定义绑定,则可能需要使用此属性。 有关详细信息,请参阅 RelativeSourceElementName 指定一个表示希望绑定到的元素的字符串。 当希望绑定到应用程序上另一个元素的属性时,这很有用。 例如,如果希望使用 Slider 控制应用程序中另一个控件的高度,或者如果希望将控件的 Content 绑定到 ListBox 控件的 SelectedValue 属性。 有关详细信息,请参阅 ElementName
  • FrameworkElement.DataContext
  • FrameworkContentElement.DataContext
  • 属性值继承
  • 数据绑定概述
  • 绑定声明概述
  • 操作指南主题
  •