Jak określić źródło wiążące

W powiązaniu danych obiekt źródłowy powiązania odwołuje się do obiektu, z którego uzyskujesz dane. W tym temacie opisano różne sposoby określania źródła powiązania.

Przykład

Jeśli wiążesz kilka właściwości ze wspólnym źródłem, chcesz użyć DataContext właściwości, która zapewnia wygodny sposób ustanowienia zakresu, w którym wszystkie właściwości powiązane z danymi dziedziczą wspólne źródło.

W poniższym przykładzie kontekst danych jest ustanawiany na głównym elemecie aplikacji. Dzięki temu wszystkie elementy podrzędne mogą dziedziczyć ten kontekst danych. Dane dla powiązania pochodzą z niestandardowej klasy danych, NetIncomedo których odwołuje się bezpośrednio mapowanie i podanego klucza incomeDataSourcezasobu .

<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>

W poniższym przykładzie przedstawiono definicję NetIncome klasy.

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

Uwaga

Powyższy przykład tworzy wystąpienie obiektu w adiustacji i używa go jako zasobu. Jeśli chcesz powiązać obiekt, który został już utworzone w kodzie, musisz ustawić DataContext właściwość programowo. Aby zapoznać się z przykładem, zobacz Udostępnianie danych dla powiązania w języku XAML.

Alternatywnie, jeśli chcesz jawnie określić źródło poszczególnych powiązań, masz następujące opcje. Mają one pierwszeństwo przed odziedziczonym kontekstem danych.

Właściwości opis
Source Ta właściwość służy do ustawiania źródła na wystąpienie obiektu. Jeśli nie potrzebujesz funkcji ustanawiania zakresu, w którym kilka właściwości dziedziczy ten sam kontekst danych, możesz użyć Source właściwości zamiast DataContext właściwości . W celu uzyskania więcej informacji, zobacz następujący temat: Source.
RelativeSource Jest to przydatne, gdy chcesz określić źródło względem miejsca docelowego powiązania. W niektórych typowych scenariuszach, w których można użyć tej właściwości, jest powiązanie jednej właściwości elementu z inną właściwością tego samego elementu lub definiowanie powiązania w stylu lub szablonie. W celu uzyskania więcej informacji, zobacz następujący temat: RelativeSource.
ElementName Należy określić ciąg reprezentujący element, z którym chcesz powiązać. Jest to przydatne, gdy chcesz powiązać z właściwością innego elementu w aplikacji. Jeśli na przykład chcesz użyć kontrolki Slider , aby kontrolować wysokość innej kontrolki w aplikacji lub jeśli chcesz powiązać Content kontrolkę z właściwością SelectedValue kontrolki ListBox . W celu uzyskania więcej informacji, zobacz następujący temat: ElementName.

Zobacz też