Aracılığıyla paylaş


Nasıl yapılır: Bağlama Kaynağını 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 ortak bir kaynağı devraldığı bir kapsam oluşturmak için kullanışlı bir yol sağlayan DataContext ö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, doğrudan bir haritalama aracılığıyla başvurulan ve NetIncomekaynak anahtarı verilen incomeDataSourceadlı özel bir veri sınıfından gelmektedir.

<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 NetIncome sınıfının tanımı gösterilmektedir.

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

Uyarı

Yukarıdaki örnek, işaretleme dilinde nesnenin bir örneğini oluşturur ve onu bir kaynak olarak kullanır. Kodda zaten örneği oluşturulmuş bir nesneye bağlanmak istiyorsanız, DataContext özelliğini program aracılığıyla ayarlamanız gerekir. Bir örnek için bkz. XAMLBağ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.

Mülkiyet Açıklama
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, Source özelliği yerine DataContext özelliğini kullanabilirsiniz. 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 kontrol etmek için bir Slider kullanmak istiyorsanız veya denetiminizin Content'ini SelectedValue denetiminizin ListBox özelliğine bağlamak istiyorsanız. Daha fazla bilgi için bkz. ElementName.

Ayrıca bakınız