Procedimiento Especificar el origen de enlaceHow to: Specify the Binding Source

En el enlace de datos, el objeto de origen de enlace hace referencia al objeto de que se obtienen los datos.In data binding, the binding source object refers to the object you obtain your data from. Este tema describe las distintas maneras de especificar el origen de enlace.This topic describes the different ways of specifying the binding source.

EjemploExample

Si va a enlazar varias propiedades con un origen común, querrá usar la propiedad DataContext, que proporciona una manera cómoda de establecer un ámbito dentro del cual todas las propiedades enlazadas a datos heredan un origen común.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.

En el ejemplo siguiente, se establece el contexto de datos en el elemento raíz de la aplicación.In the following example, the data context is established on the root element of the application. Esto permite que todos los elementos secundarios hereden ese contexto de datos.This allows all child elements to inherit that data context. Los datos para el enlace proceden de una clase de datos personalizada, NetIncome, al que hace referencia directamente a través de una asignación y una clave de recurso determinada de incomeDataSource.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>

En el ejemplo siguiente se muestra la definición de la clase 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

Nota

El ejemplo anterior crea una instancia del objeto en la marcación y lo usa como un recurso.The above example instantiates the object in markup and uses it as a resource. Si desea enlazar con un objeto que ya ha creado una instancia en el código, debe establecer la propiedad DataContext mediante programación.If you want to bind to an object that has already been instantiated in code, you need to set the DataContext property programmatically. Para obtener un ejemplo, vea Hacer que los datos estén disponibles para el enlace en XAML.For an example, see Make Data Available for Binding in XAML.

Como alternativa, si desea especificar el origen en los enlaces individuales explícitamente, tiene las siguientes opciones.Alternatively, if you want to specify the source on your individual bindings explicitly, you have the following options. Estas tienen prioridad sobre el contexto de datos heredado.These take precedence over the inherited data context.

PropiedadProperty DescripciónDescription
Source Utilice esta propiedad para establecer el origen en una instancia de un objeto.You use this property to set the source to an instance of an object. Si no necesita la funcionalidad de establecimiento de un ámbito en que varias propiedades heredan el mismo contexto de datos, puede usar el Source propiedad en lugar de la DataContext propiedad.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. Para obtener más información, consulta Source.For more information, see Source.
RelativeSource Esto es útil cuando desea especificar el origen con respecto a donde está el destino del enlace.This is useful when you want to specify the source relative to where your binding target is. Entre los escenarios frecuentes en los que puede utilizar esta propiedad se encuentran las situaciones en las que desee enlazar una propiedad del elemento con otra propiedad del mismo elemento o situaciones en las que esté definiendo un enlace en un estilo o una plantilla.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. Para obtener más información, consulta RelativeSource.For more information, see RelativeSource.
ElementName Especifique una cadena que represente el elemento con el que desee establecer el enlace.You specify a string that represents the element you want to bind to. Esto es útil cuando desea enlazar con la propiedad de otro elemento de la aplicación.This is useful when you want to bind to the property of another element on your application. Por ejemplo, si desea usar un Slider para controlar la altura de otro control en la aplicación, o si desea enlazar el Content del control a la SelectedValue propiedad de su ListBox control.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. Para obtener más información, consulta ElementName.For more information, see ElementName.

Vea tambiénSee also