Condividi tramite


Procedura: Specificare l'origine dell'associazione di dati

Nell'associazione dati, l'oggetto origine di associazione fa riferimento all'oggetto da cui si ottengono i dati. In questo argomento vengono descritti i diversi modi per specificare l'origine di associazione.

Esempio

Se si associano più proprietà a un'origine comune, si desidera utilizzare la proprietà DataContext, che consente di stabilire un ambito all'interno del quale tutte le proprietà associate a dati ereditano un'origine comune.

Nell'esempio seguente il contesto dei dati viene stabilito sull'elemento radice dell'applicazione. In questo modo tutti gli elementi figlio ereditano tale contesto di dati. I dati per l'associazione provengono da una classe di dati personalizzata, NetIncome, a cui si fa riferimento direttamente tramite un mapping e a cui viene assegnata la chiave di risorsa 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>

Nell'esempio seguente viene illustrata la definizione della classe 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
    {
        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 istanzia l'oggetto nel markup e lo usa come risorsa. Se si vuole eseguire l'associazione a un oggetto di cui è già stata creata un'istanza nel codice, è necessario impostare la proprietà DataContext a livello di codice. Per un esempio, vedi Rendere i dati disponibili per il binding in XAML.

In alternativa, se desideri specificare l'origine per le tue associazioni individuali in modo esplicito, hai le seguenti opzioni. Questi hanno la precedenza sul contesto dei dati ereditato.

Proprietà Descrizione
Source Utilizzi questa proprietà per impostare la sorgente su un'istanza di un oggetto. Se non è necessaria la funzionalità di definizione di un ambito in cui diverse proprietà ereditano lo stesso contesto dati, è possibile utilizzare la proprietà Source anziché la proprietà DataContext. Per altre informazioni, vedere Source.
RelativeSource Questo è utile quando vuoi specificare l'origine relativa a dove si trova il tuo obiettivo di binding. Alcuni scenari comuni in cui è possibile utilizzare questa proprietà sono quando si desidera associare una proprietà dell'elemento a un'altra proprietà dello stesso elemento o se si definisce un'associazione in uno stile o un modello. Per altre informazioni, vedere RelativeSource.
ElementName Si specifica una stringa che rappresenta l'elemento a cui si desidera associare. Ciò è utile quando si vuole eseguire l'associazione alla proprietà di un altro elemento nell'applicazione. 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 alla proprietà SelectedValue del controllo ListBox. Per altre informazioni, vedere ElementName.

Vedere anche