Gör så här: Ange bindningskällan
I databindningen refererar det bindande källobjektet till det objekt som du hämtar dina data från. Det här avsnittet beskriver de olika sätten att ange bindningskällan.
Exempel
Om du binder flera egenskaper till en gemensam källa vill du använda egenskapen DataContext
, vilket är ett bekvämt sätt att upprätta ett omfång inom vilket alla databundna egenskaper ärver en gemensam källa.
I följande exempel upprättas datakontexten på programmets rotelement. Detta gör att alla underordnade element kan ärva datakontexten. Data för bindningen kommer från en anpassad dataklass, NetIncome
, som refereras direkt via en mappning och ges resursnyckeln 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>
I följande exempel visas definitionen av klassen 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
Obs
Exemplet ovan instansierar objektet i markering och använder det som en resurs. Om du vill binda till ett objekt som redan har instansierats i kod måste du ange DataContext
-egenskapen programmatiskt. Ett exempel finns i Göra data tillgängliga för bindning i XAML-.
Om du vill ange källan för dina enskilda bindningar explicit har du följande alternativ. Dessa har företräde framför den ärvda datakontexten.
Egenskap | Beskrivning |
---|---|
Source | Du använder den här egenskapen för att ange källan till en instans av ett objekt. Om du inte behöver funktionen för att upprätta ett omfång där flera egenskaper ärver samma datakontext kan du använda egenskapen Source i stället för egenskapen DataContext . Mer information finns i Source. |
RelativeSource | Det här är användbart när du vill ange källan i förhållande till var bindningsmålet finns. Några vanliga scenarier där du kan använda den här egenskapen är när du vill binda en egenskap för ditt element till en annan egenskap för samma element eller om du definierar en bindning i ett format eller en mall. Mer information finns i RelativeSource. |
ElementName | Du anger en sträng som representerar det element som du vill binda till. Detta är användbart när du vill binda till egenskapen för ett annat element i ditt program. Om du till exempel vill använda en Slider för att styra höjden på en annan kontroll i ditt program, eller om du vill binda Content av kontrollen till egenskapen SelectedValue för din ListBox kontroll. Mer information finns i ElementName. |
Se även
.NET Desktop feedback