Nasıl yapılır: Bağlama Kaynağı Belirtme
Veri bağlamada bağlama kaynak nesnesi, verilerinizi aldığınız nesneye başvurur. Bu konu, bağlama kaynağını belirtmenin farklı yollarını açıklar.
Örnek
Birden çok özelliği ortak bir kaynağa bağlıyorsanız, tüm veriye bağlı özelliklerin DataContext
ortak bir kaynağı devraldığı bir kapsam oluşturmak için kullanışlı bir yol sağlayan özelliğini kullanmak istiyorsunuz.
Aşağıdaki örnekte, uygulamanın kök öğesinde veri bağlamı oluşturulmuştur. Bu, tüm alt öğelerin bu veri bağlamı devralmasını sağlar. Bağlama verileri, NetIncome
doğrudan bir eşleme aracılığıyla başvuruda bulunup kaynak anahtarı verilen özel bir veri sınıfından incomeDataSource
gelir.
<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>
Aşağıdaki örnekte sınıfın tanımı gösterilmektedir 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
Dekont
Yukarıdaki örnek, işaretlemede nesnesinin örneğini oluşturur ve bunu kaynak olarak kullanır. Kodda zaten örneği oluşturulmuş bir nesneye bağlanmak istiyorsanız, özelliği program aracılığıyla ayarlamanız DataContext
gerekir. Bir örnek için bkz . XAML'de Bağlama için Verileri Kullanılabilir Hale Getirme.
Alternatif olarak, tek tek bağlamalarınızdaki kaynağı açıkça belirtmek istiyorsanız aşağıdaki seçeneklere sahip olursunuz. Bunlar devralınan veri bağlamından önceliklidir.
Özellik | Tanım |
---|---|
Source | Kaynağı bir nesnenin örneğine ayarlamak için bu özelliği kullanırsınız. Birden çok özelliğin aynı veri bağlamını devraldığı bir kapsam oluşturma işlevine ihtiyacınız yoksa, özelliği yerine DataContext özelliğini kullanabilirsinizSource. Daha fazla bilgi için bkz. Source. |
RelativeSource | Bu, bağlama hedefinizin bulunduğu yere göre kaynağı belirtmek istediğinizde kullanışlıdır. Bu özelliği kullanabileceğiniz bazı yaygın senaryolar, öğenizin bir özelliğini aynı öğenin başka bir özelliğine bağlamak istediğinizde veya bir stilde veya şablonda bağlama tanımlıyor olmanızdır. Daha fazla bilgi için bkz. RelativeSource. |
ElementName | Bağlamak istediğiniz öğeyi temsil eden bir dize belirtirsiniz. Bu, uygulamanızdaki başka bir öğenin özelliğine bağlanmak istediğinizde kullanışlıdır. Örneğin, uygulamanızdaki başka bir denetimin yüksekliğini denetlemek için kullanmak Slider veya denetiminizin özelliğini denetiminizin ListBox özelliğine SelectedValue bağlamak Content istiyorsanız. Daha fazla bilgi için bkz. ElementName. |
Ayrıca bkz.
.NET Desktop feedback