Freigeben über


Vorgehensweise: Angeben der Bindungsquelle

In der Datenbindung bezieht sich das Bindungsquellobjekt auf das Objekt, aus dem Sie Ihre Daten abrufen. In diesem Thema werden die verschiedenen Methoden zum Angeben der Bindungsquelle beschrieben.

Beispiel

Wenn Sie mehrere Eigenschaften an eine gemeinsame Quelle binden, möchten Sie die DataContext-Eigenschaft verwenden, die eine bequeme Möglichkeit zum Einrichten eines Bereichs bietet, in dem alle datengebundenen Eigenschaften eine gemeinsame Quelle erben.

Im folgenden Beispiel wird der Datenkontext für das Stammelement der Anwendung eingerichtet. Dadurch können alle untergeordneten Elemente diesen Datenkontext erben. Daten für die Bindung stammen aus einer benutzerdefinierten Datenklasse NetIncome, auf die direkt über eine Zuordnung verwiesen wird und der der Ressourcenschlüssel incomeDataSourcezugeordnet wird.

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

Das folgende Beispiel zeigt die Definition der klasse 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

Anmerkung

Im obigen Beispiel wird das Objekt im Markup instanziiert und als Ressource verwendet. Wenn Sie eine Bindung an ein Objekt erstellen möchten, das bereits im Code instanziiert wurde, müssen Sie die DataContext-Eigenschaft programmgesteuert festlegen. Ein Beispiel finden Sie unter Daten für die Bindung in XAML verfügbar machen.

Wenn Sie die Quelle für Ihre individuellen Bindungen explizit angeben möchten, haben Sie die folgenden Optionen. Diese haben Vorrang vor dem geerbten Datenkontext.

Eigentum Beschreibung
Source Mit dieser Eigenschaft legen Sie die Quelle auf eine Instanz eines Objekts fest. Wenn Sie nicht die Funktionalität zum Einrichten eines Bereichs benötigen, in dem mehrere Eigenschaften denselben Datenkontext erben, können Sie die Source-Eigenschaft anstelle der DataContext-Eigenschaft verwenden. Weitere Informationen finden Sie unter Source.
RelativeSource Dies ist nützlich, wenn Sie die Quelle relativ zu Ihrem Bindungsziel angeben möchten. Einige häufige Szenarien, in denen Sie diese Eigenschaft verwenden können, sind, wenn Sie eine Eigenschaft Ihres Elements an eine andere Eigenschaft dieses Elements binden möchten oder wenn Sie eine Bindung in einem Stil oder einer Vorlage definieren. Weitere Informationen finden Sie unter RelativeSource.
ElementName Sie geben eine Zeichenfolge an, die das Element angibt, an das Sie binden möchten. Dies ist nützlich, wenn Sie eine Bindung an die Eigenschaft eines anderen Elements in Ihrer Anwendung erstellen möchten. Wenn Sie z. B. eine Slider verwenden möchten, um die Höhe eines anderen Steuerelements in Ihrer Anwendung zu steuern, oder wenn Sie die Content des Steuerelements an die Eigenschaft SelectedValue Ihres ListBox-Steuerelements binden möchten. Weitere Informationen finden Sie unter ElementName.

Siehe auch