Практическое руководство. Указание источника привязки
В привязке данных объект источник привязки ссылается на объект, из которого получаются данные. В этом разделе описываются различные способы указания источника привязки.
Пример
При привязке нескольких свойств к общему источнику может понадобиться использовать свойство DataContext, которое предоставляет удобный способ для установления области видимости, внутри которой все свойства с привязкой к данным наследуют общий источник.
В следующем примере контекст данных устанавливается для корневого элемента приложения. Это позволяет всем дочерним элементам наследовать этот контекст данных. Данные для привязки поступают из настраиваемого класса данных, NetIncome, ссылки на который выполняются непосредственно через сопоставление и через полученный ключ ресурса 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>
В следующем примере показано определение класса 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));
}
}
}
Примечание |
---|
Вышеприведенный пример создает экземпляр объекта в разметке и использует его в качестве ресурса.Если требуется выполнить привязку к объекту, экземпляр которого был уже создан в коде, необходимо установить свойство DataContext программным образом.Пример см. в разделе Практическое руководство. Обеспечение доступности данных для привязки в XAML. |
Кроме того, если требуется явно указать источник в отдельных привязках, возможны следующие параметры. Они имеют приоритет над наследуемым контекстом данных.
Свойство |
Описание |
---|---|
Это свойство используется для установки источника экземпляра объекта. Если не нужны функциональные возможности установки области видимости, в которой несколько свойств наследуют один и тот же контекст данных, можно использовать свойство Source вместо свойства DataContext. Дополнительные сведения см. в разделе Source. |
|
Это полезно, если требуется указать источник относительно того, где расположена цель привязки. Некоторыми общими скриптами, в которых можно использовать это свойство, являются сценарии, когда требуется выполнить привязку одного свойства элемента к другому свойству этого же элемента, или если привязка задается в стиле или шаблоне. Дополнительные сведения см. в разделе RelativeSource. |
|
Следует указать строку, представляющую элемент, к которому требуется осуществить привязку. Это полезно, если необходимо выполнить привязку к свойству другого элемента в вашем приложении. Например, если требуется использовать Slider для управления высотой другого элемента управления в приложении, или если требуется выполнить привязку Content элемента управления к свойству SelectedValue элемента управления ListBox. Дополнительные сведения см. в разделе ElementName. |
См. также
Ссылки
FrameworkContentElement.DataContext
Основные понятия
Наследование значения свойства
Общие сведения о связывании данных
Общие сведения об объявлении привязок