Procedura: specificare l'origine di associazione
Nell'associazione dati, l'oggetto origine di associazione fa riferimento all'oggetto da cui si ottengono i dati. In questo argomento vengono descritte le diverse modalità per la specifica dell'origine di associazione.
Esempio
Se si associano più proprietà a un'origine comune, è opportuno utilizzare la proprietà DataContext, che consente di stabilire in modo pratico un ambito entro cui tutte le proprietà con associazione a dati ereditano un'origine comune.
Nell'esempio riportato di seguito, il contesto dati viene stabilito sull'elemento radice dell'applicazione. In questo modo tutti gli elementi figlio possono ereditare tale contesto dati. I dati per l'associazione derivano da una classe di dati personalizzata, NetIncome, a cui viene fatto riferimento direttamente tramite un mapping e viene assegnata la chiave di risorsa di incomeDataSource.
<Grid
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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 riportato di seguito viene illustrata la definizione della classe NetIncome.
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
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));
}
}
}
Nota |
---|
Nell'esempio riportato in precedenza un'istanza dell'oggetto viene creata nel markup e viene utilizzata come risorsa.Se si desidera 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, vedere Procedura: rendere i dati disponibili per l'associazione in XAML. |
In alternativa, per specificare in modo esplicito l'origine sulle singole associazioni, sono disponibili le opzioni seguenti, che hanno la precedenza sul contesto dati ereditato.
Proprietà |
Descrizione |
---|---|
Utilizzare questa proprietà per impostare l'origine su un'istanza di un oggetto. Se non è necessario disporre della funzionalità per stabilire un ambito in cui più proprietà ereditano lo stesso contesto dati, è possibile utilizzare la proprietà Source anziché la proprietà DataContext. Per ulteriori informazioni, vedere Source. |
|
Questa proprietà è utile quando si desidera specificare l'origine relativa alla posizione in cui si trova la destinazione dell'associazione. Tra gli scenari comuni che consentono l'utilizzo di questa proprietà vi sono i casi in cui si desidera associare una proprietà dell'elemento a un'altra proprietà dello stesso elemento o in cui si definisce un'associazione in uno stile o in un modello. Per ulteriori informazioni, vedere RelativeSource. |
|
Specificare una stringa che rappresenta l'elemento a cui si desidera eseguire l'associazione. Questa operazione è utile quando si desidera eseguire l'associazione alla proprietà di un altro elemento dell'applicazione. Ad esempio, se si desidera utilizzare un oggetto Slider per controllare l'altezza di un altro controllo dell'applicazione oppure associare la proprietà Content del controllo alla proprietà SelectedValue del controllo ListBox. Per ulteriori informazioni, vedere ElementName. |
Vedere anche
Riferimenti
FrameworkContentElement.DataContext
Concetti
Ereditarietà del valore della proprietà
Cenni preliminari sull'associazione dati
Cenni preliminari sulle dichiarazioni di associazione