Útmutató: A kötés forrásának megadása

Az adatkötésben a kötés forrásobjektuma arra az objektumra hivatkozik, amelyből adatokat szerez be. Ez a témakör a kötési forrás megadásának különböző módjait ismerteti.

példa

Ha több tulajdonságot köt egy közös forráshoz, a DataContext tulajdonságot szeretné használni, amely kényelmes módot kínál egy olyan hatókör létrehozására, amelyen belül az összes adathoz kötött tulajdonság örököl egy közös forrást.

Az alábbi példában az adatkörnyezet az alkalmazás gyökérelemén jön létre. Ez lehetővé teszi, hogy minden gyermekelem örökölje ezt az adatkörnyezetet. A kötés adatai egy egyéni adatosztályból származnak, NetIncome, amely közvetlenül egy leképezés útján van hivatkozva, és rendelkezik a incomeDataSourceerőforrás kulcsával.

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

Az alábbi példa a NetIncome osztály definícióját mutatja be.

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

Megjegyzés:

A fenti példa példányosítja az objektumot a jelölőnyelvben, és erőforrásként használja. Ha olyan objektumhoz szeretne kapcsolódni, amely már példányosított a kódban, programozott módon kell beállítania a DataContext tulajdonságot. Példáért lásd: Adatok elérhetővé tétele kötéshez az XAML.

Ha az egyes kötéseken explicit módon szeretné megadni a forrást, az alábbi lehetőségek közül választhat. Ezek elsőbbséget élveznek az örökölt adatkörnyezettel szemben.

Ingatlan Leírás
Source Ezzel a tulajdonsággal állíthatja be a forrást egy objektum példányára. Ha nincs szüksége olyan hatókör létrehozására, amelyben több tulajdonság örökli ugyanazt az adatkörnyezetet, akkor a Source tulajdonság helyett használhatja a DataContext tulajdonságot. További információért lásd Source.
RelativeSource Ez akkor hasznos, ha a forrást a kötési cél helyéhez viszonyítva szeretné megadni. Néhány gyakori eset, amikor ezt a tulajdonságot használhatja, ha az elem egyik tulajdonságát ugyanahhoz az elemhez egy másik tulajdonsághoz szeretné kötni, vagy ha stílusban vagy sablonban definiál kötést. További információért lásd RelativeSource.
ElementName Meg kell adnia egy sztringet, amely azt az elemet jelöli, amelyhez kötést szeretne kötni. Ez akkor hasznos, ha az alkalmazás egy másik elemének tulajdonságához szeretne kapcsolódni. Ha például azt szeretné, hogy egy Slider szabályozza egy másik vezérlő magasságát az alkalmazásban, vagy ha a vezérlő Content értékét a SelectedValue vezérlő ListBox tulajdonságához szeretné kötni. További információért lásd ElementName.

Lásd még