Bagikan melalui


Cara: Tentukan Sumber Pengikatan

Dalam pengikatan data, objek sumber pengikatan mengacu pada objek tempat Anda mendapatkan data. Topik ini menjelaskan berbagai cara untuk menentukan sumber pengikatan.

Contoh

Jika Anda mengikat beberapa properti ke sumber umum, Anda ingin menggunakan properti DataContext, yang menyediakan cara mudah untuk membuat cakupan di mana semua properti terikat data mewarisi sumber umum.

Dalam contoh berikut, konteks data ditetapkan pada elemen akar aplikasi. Ini memungkinkan semua elemen anak untuk mewarisi konteks data tersebut. Data untuk pengikatan berasal dari kelas data kustom, NetIncome, dirujuk langsung melalui pemetaan dan diberikan kunci sumber daya 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>

Contoh berikut menunjukkan definisi kelas 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

Contoh di atas membuat instans objek dalam markup dan menggunakannya sebagai sumber daya. Jika Anda ingin mengikat ke objek yang telah dibuat dalam kode, Anda perlu mengatur properti DataContext secara terprogram. Misalnya, lihat Menyediakan Data untuk Pengikatan di XAML.

Atau, jika Anda ingin menentukan sumber pada pengikatan individual Anda secara eksplisit, Anda memiliki opsi berikut. Ini lebih diutamakan daripada konteks data yang diwariskan.

Harta benda Deskripsi
Source Anda menggunakan properti ini untuk menetapkan sumber ke sebuah instans objek. Jika Anda tidak memerlukan fungsionalitas untuk membuat cakupan di mana beberapa properti mewarisi konteks data yang sama, Anda dapat menggunakan properti Source alih-alih properti DataContext. Untuk informasi selengkapnya, lihat Source .
RelativeSource Ini berguna ketika Anda ingin menentukan sumber relatif terhadap di mana target pengikatan Anda berada. Beberapa skenario umum di mana Anda dapat menggunakan properti ini adalah ketika Anda ingin mengikat satu properti elemen Anda ke properti lain dari elemen yang sama atau jika Anda menentukan pengikatan dalam gaya atau templat. Untuk informasi selengkapnya, lihat RelativeSource .
ElementName Anda menentukan string yang mewakili elemen yang ingin Anda ikat. Ini berguna ketika Anda ingin mengikat properti elemen lain pada aplikasi Anda. Misalnya, jika Anda ingin menggunakan Slider untuk mengontrol tinggi kontrol lain di aplikasi Anda, atau jika Anda ingin mengikat Content kontrol Anda ke properti SelectedValue kontrol ListBox Anda. Untuk informasi selengkapnya, lihat ElementName .

Lihat juga