Procedura: specificare l'origine del bindingHow to: Specify the Binding Source

Nel data binding l'oggetto origine di binding fa riferimento all'oggetto da cui si ottengono i dati.In data binding, the binding source object refers to the object you obtain your data from. Questo argomento descrive i vari modi per specificare l'origine del binding.This topic describes the different ways of specifying the binding source.

EsempioExample

Se si associano più proprietà a un'origine comune, è consigliabile usare la proprietà DataContext, che offre un modo pratico per definire un ambito in cui tutte le proprietà associate ai dati ereditano un'origine comune.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.

Nell'esempio seguente il contesto dei dati viene stabilito nell'elemento radice dell'applicazione.In the following example, the data context is established on the root element of the application. In questo modo tutti gli elementi figlio ereditano il contesto dei dati.This allows all child elements to inherit that data context. I dati per il binding derivano da una classe di dati personalizzata, NetIncome, a cui viene direttamente fatto riferimento tramite un mapping e assegnata la chiave di risorsa di 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>

L'esempio seguente illustra la definizione della classe 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

L'esempio precedente crea un'istanza dell'oggetto nel markup e la usa come risorsa.The above example instantiates the object in markup and uses it as a resource. Per eseguire il binding a un oggetto di cui è già stata creata un'istanza nel codice, è necessario impostare la proprietà DataContext a livello di codice.If you want to bind to an object that has already been instantiated in code, you need to set the DataContext property programmatically. Per un esempio, vedere Rendere i dati disponibili per l'associazione in XAML.For an example, see Make Data Available for Binding in XAML.

In alternativa, se si desidera specificare l'origine nei singoli binding in modo esplicito, sono disponibili le opzioni seguenti.Alternatively, if you want to specify the source on your individual bindings explicitly, you have the following options. Queste hanno precedenza sul contesto dei dati ereditato.These take precedence over the inherited data context.

ProprietàProperty DescrizioneDescription
Source Usare questa proprietà per impostare l'origine su un'istanza di un oggetto.You use this property to set the source to an instance of an object. Se non è necessaria la funzionalità di creazione di un ambito in cui più proprietà ereditano il contesto dei dati stessi, è possibile utilizzare il Source proprietà anziché il DataContext proprietà.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. Per altre informazioni, vedere Source.For more information, see Source.
RelativeSource Risulta utile se si desidera specificare l'origine rispetto alla posizione in cui si trova la destinazione del binding.This is useful when you want to specify the source relative to where your binding target is. Alcuni scenari comuni in cui è possibile usare questa proprietà: se si desidera associare una proprietà dell'elemento a un'altra proprietà dello stesso elemento oppure se si definisce un binding in uno stile o un modello.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. Per altre informazioni, vedere RelativeSource.For more information, see RelativeSource.
ElementName Specificare una stringa che rappresenta l'elemento a cui si desidera eseguire il binding.You specify a string that represents the element you want to bind to. Risulta utile se si desidera eseguire il binding alla proprietà di un altro elemento dell'applicazione,This is useful when you want to bind to the property of another element on your application. Ad esempio, se si desidera utilizzare un Slider per controllare l'altezza di un altro controllo nell'applicazione, o se si desidera associare il Content del controllo per il SelectedValue proprietà del ListBox controllo.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. Per altre informazioni, vedere ElementName.For more information, see ElementName.

Vedere ancheSee Also

FrameworkElement.DataContext
FrameworkContentElement.DataContext
Ereditarietà del valore della proprietàProperty Value Inheritance
Panoramica sul data bindingData Binding Overview
Panoramica sulle dichiarazioni di associazioneBinding Declarations Overview
Procedure relative alle proprietàHow-to Topics