Bağlama bildirimleri nedir? (WPF .NET)

Genellikle, geliştiriciler bağlamaları doğrudan verileri bağlamak istedikleri kullanıcı arabirimi öğelerinin XAML işaretlemesinde bildirir. Ancak, bağlamaları kodda da bildirebilirsiniz. Bu makalede hem XAML'de hem de kodda bağlamaların nasıl bildirdiği açıklanır.

Önkoşullar

Bu makaleyi okumadan önce, işaretleme uzantılarının kavramını ve kullanımını bilmeniz önemlidir. biçimlendirme uzantıları hakkında daha fazla bilgi için bkz . İşaretlemeyi Genişletmeler ve WPF XAML.

Bu makale veri bağlama kavramlarını kapsamaz. Veri bağlama kavramlarıyla ilgili bir tartışma için bkz . Veri bağlamaya genel bakış.

XAML'de bağlama bildirme

Binding bir işaretleme uzantısıdır. Bağlama uzantısını kullanarak bir bağlama bildirdiğinizde, bildirim anahtar sözcüğünü izleyen Binding ve virgülle (,) ayrılmış bir dizi yan tümceden oluşur. Bağlama bildirimindeki yan tümceler herhangi bir sırada olabilir ve birçok olası birleşim vardır. Yan tümceleri Name=Value çiftleridir. Burada Name özelliğin Binding adıdır ve Value özelliği için ayarladığınız değerdir.

İşaretlemede bağlama bildirimi dizeleri oluştururken, bunların hedef nesnenin belirli bağımlılık özelliğine eklenmesi gerekir. Aşağıdaki örnek, ve Path özelliklerini belirterek bağlama uzantısını kullanarak özelliğin Source nasıl bağlanacağını TextBox.Text gösterir.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>

Önceki örnekte basit bir veri nesnesi türü Personkullanılır. Aşağıdaki kod parçacığı, bu nesnenin kodudur:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

Sınıfın özelliklerinin Binding çoğunu bu şekilde belirtebilirsiniz. Bağlama uzantısı hakkında daha fazla bilgi edinmek ve bağlama uzantısı kullanılarak ayarlanamayan özelliklerin Binding listesi için bkz . Bağlama biçimlendirme uzantısına (.NET Framework) genel bakış.

XAML'de bağlama oluşturma örneği için bkz . Veri bağlaması oluşturma.

Nesne öğesi söz dizimi

Nesne öğesi söz dizimi, bağlama bildirimi oluşturmaya alternatiftir. Çoğu durumda, işaretleme uzantısını veya nesne öğesi söz dizimini kullanmanın belirli bir avantajı yoktur. Ancak, işaretleme uzantısı senaryonuzu desteklemiyorsa( örneğin özellik değeriniz tür dönüştürmesi olmayan bir dize türünde olduğunda) nesne öğesi söz dizimini kullanmanız gerekir.

Önceki bölümde bir XAML uzantısıyla nasıl bağlanıldığı gösterilmiştir. Aşağıdaki örnekte aynı bağlamanın yapılması gösterilmektedir ancak nesne öğesi söz dizimi kullanılmaktadır:

<TextBlock>
    <TextBlock.Text>
        <Binding Source="{StaticResource myDataSource}" Path="Name"/>
    </TextBlock.Text>
</TextBlock>

Farklı terimler hakkında daha fazla bilgi için bkz . XAML Söz Dizimi Ayrıntılı (.NET Framework).

MultiBinding ve PriorityBinding

MultiBinding ve PriorityBinding XAML uzantısı söz dizimini desteklemez. Bu nedenle, XAML'de veya MultiBinding PriorityBinding bildiriyorsanız nesne öğesi söz dizimini kullanmanız gerekir.

Kodda bağlama oluşturma

Bağlama belirtmenin bir diğer yolu da özellikleri doğrudan koddaki bir Binding nesne üzerinde ayarlamak ve ardından bağlamayı bir özelliğe atamaktır. Aşağıdaki örnekte kodda bir nesnenin nasıl oluşturulacağı Binding gösterilmektedir.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // Make a new data source object
    var personDetails = new Person()
    {
        Name = "John",
        Birthdate = DateTime.Parse("2001-02-03")
    };

    // New binding object using the path of 'Name' for whatever source object is used
    var nameBindingObject = new Binding("Name");

    // Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay;
    nameBindingObject.Source = personDetails;
    nameBindingObject.Converter = NameConverter.Instance;
    nameBindingObject.ConverterCulture = new CultureInfo("en-US");

    // Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)

    ' Make a new data source object
    Dim personDetails As New Person() With {
        .Name = "John",
        .Birthdate = Date.Parse("2001-02-03")
    }

    ' New binding object using the path of 'Name' for whatever source object is used
    Dim nameBindingObject As New Binding("Name")

    ' Configure the binding
    nameBindingObject.Mode = BindingMode.OneWay
    nameBindingObject.Source = personDetails
    nameBindingObject.Converter = NameConverter.Instance
    nameBindingObject.ConverterCulture = New CultureInfo("en-US")

    ' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
    BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)

End Sub

Önceki kod bağlamada aşağıdakileri ayarlar:

  • Veri kaynağı nesnesinde özelliğinin yolu.
  • Bağlama modu.
  • Bu örnekte veri kaynağı, bir kişiyi temsil eden basit bir nesne örneğidir.
  • Hedef özelliğe atanmadan önce veri kaynağı nesnesinden gelen değeri işleyen isteğe bağlı bir dönüştürücü.

Bağladığınız nesne bir FrameworkElement veya FrameworkContentElementolduğunda, yöntemini kullanmak BindingOperations.SetBindingyerine doğrudan nesnenizde çağırabilirsinizSetBinding. Bir örnek için bkz . Nasıl yapılır: Kodda Bağlama Oluşturma.

Önceki örnekte basit bir veri nesnesi türü Personkullanılır. Bu nesnenin kodu aşağıdadır:

class Person
{
    public string Name { get; set; }
    public DateTime Birthdate { get; set; }
}
Public Class Person

    Public Property Name As String
    Public Property Birthdate As DateTime
    
End Class

Bağlama yolu söz dizimi

Path Bağlamak istediğiniz kaynak değeri belirtmek için özelliğini kullanın:

  • En basit durumda, Path özellik değeri bağlama için kullanılacak kaynak nesnenin özelliğinin adıdır( gibi Path=PropertyName).

  • Bir özelliğin alt özellikleri, C# dilindekine benzer bir söz dizimi ile belirtilebilir. Örneğin, yan tümcesi Path=ShoppingCart.Order bağlamayı nesnesinin veya özelliğinin ShoppingCartalt özelliğine Order ayarlar.

  • Ekli bir özelliğe bağlanmak için, ekli özelliğin çevresine ayraçlar yerleştirin. Örneğin, ekli özelliğine DockPanel.Dockbağlanmak için söz dizimi şeklindedir Path=(DockPanel.Dock).

  • Bir özelliğin dizin oluşturucuları, dizin oluşturucunun uygulandığı özellik adının ardından köşeli ayraçlar içinde belirtilebilir. Örneğin, yan tümcesi Path=ShoppingCart[0] , özelliğinizin iç dizin oluşturma işleminin "0" değişmez dizesini nasıl işlediğine karşılık gelen bağlamayı dizine ayarlar. İç içe dizin oluşturucular da desteklenir.

  • Dizin oluşturucular ve alt özellikler bir Path yan tümcede karıştırılabilir; örneğin, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • dizin oluşturucuların içinde. Virgülle (,) ayrılmış birden çok dizin oluşturucu parametresine sahip olabilirsiniz. Her parametrenin türü parantez içinde belirtilebilir. Örneğin, ad alanına eşlenmiş System olan sys öğesine sahip Path="[(sys:Int32)42,(sys:Int32)24]"olabilirsiniz.

  • Kaynak bir koleksiyon görünümü olduğunda, geçerli öğe eğik çizgi (/ ) ile belirtilebilir. Örneğin, yan tümcesi Path=/ görünümdeki geçerli öğeye bağlamayı ayarlar. Kaynak bir koleksiyon olduğunda, bu söz dizimi varsayılan koleksiyon görünümünün geçerli öğesini belirtir.

  • Özellik adları ve eğik çizgiler, koleksiyonlar olan özellikler arasında geçiş yapmak için birleştirilebilir. Örneğin, Path=/Offices/ManagerName aynı zamanda koleksiyon olan bir Offices özelliği içeren kaynak koleksiyonun geçerli öğesini belirtir. Geçerli öğesi bir özellik içeren bir ManagerName nesnedir.

  • İsteğe bağlı olarak, geçerli kaynağa bağlanmak için nokta (.) yolu kullanılabilir. Örneğin Text="{Binding}" ile Text="{Binding Path=.}" eşdeğerdir.

Kaçış mekanizması

  • Dizin oluşturucuların ([ ] içinde), şapka işareti karakteri (^) bir sonraki karakterden kaçar.

  • XAML'de ayarlarsanız Path , XML dil tanımı için özel olan belirli karakterlere de (XML varlıklarını kullanarak) kaçış yapmanız gerekir:

    • "&" karakterinden kaçmak için kullanın&amp;.

    • ">" bitiş etiketinden kaçmak için kullanın&gt;.

  • Ayrıca, işaretleme uzantısı söz dizimini kullanarak bir öznitelikteki bağlamanın tamamını açıklarsanız, WPF işaretleme uzantısı ayrıştırıcısı için özel olan kaçış (ters eğik çizgi \kullanarak) karakterleri kullanmanız gerekir:

    • Ters eğik çizgi (\), kaçış karakterinin kendisidir.

    • Eşittir işareti (=), özellik adını özellik değerinden ayırır.

    • Virgül (,) özellikleri ayırır.

    • Sağ küme ayracı (}), işaretleme uzantısının sonudur.

Bağlama yönü

Bağlamanın Binding.Mode yönünü belirtmek için özelliğini kullanın. Aşağıdaki modlar, güncelleştirmeleri bağlamaya yönelik kullanılabilir seçeneklerdir:

Bağlama modu Açıklama
BindingMode.TwoWay Hedef özellik veya kaynak özellik her değiştiğinde hedef özelliği veya özelliği güncelleştirir.
BindingMode.OneWay Hedef özelliği yalnızca kaynak özellik değiştiğinde güncelleştirir.
BindingMode.OneTime Hedef özelliği yalnızca uygulama başlatıldığında veya bir değişiklik yapıldığında DataContext güncelleştirir.
BindingMode.OneWayToSource Hedef özellik değiştiğinde kaynak özelliği güncelleştirir.
BindingMode.Default Hedef özelliğin varsayılan Mode değerinin kullanılmasına neden olur.

Daha fazla bilgi için numaralandırmaya BindingMode bakın.

Aşağıdaki örnekte özelliğin nasıl ayarlanacağı gösterilmektedir Mode :

<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />

Kaynak değişikliklerini algılamak için (OneWay ve TwoWay bağlamaları için geçerlidir), kaynağın INotifyPropertyChanged gibi uygun bir özellik değişikliği bildirim mekanizması uygulaması gerekir. Daha fazla bilgi için bkz . Değişiklik bildirimleri sağlama.

veya OneWayToSource bağlamaları içinTwoWay, özelliğini ayarlayarak UpdateSourceTrigger kaynak güncelleştirmelerin zamanlamasını denetleyebilirsiniz. Daha fazla bilgi için bkz. UpdateSourceTrigger.

Varsayılan davranışlar

Bildirimde belirtilmezse, varsayılan davranış aşağıdaki gibidir:

  • Bağlama kaynak değeri ile bağlama hedef değeri arasında tür dönüştürmesi yapmaya çalışan bir varsayılan dönüştürücü oluşturulur. Dönüştürme yapılamazsa, varsayılan dönüştürücü döndürür null.

  • ayarlamazsanız ConverterCulture, bağlama altyapısı bağlama hedef nesnesinin özelliğini kullanır Language . XAML'de, açıkça ayarlanmışsa, bu değer sayfanın kök öğesinde (veya herhangi bir öğede) varsayılan en-US olarak kullanılır veya devralır.

  • Bağlamanın zaten bir veri bağlamı (örneğin, bir üst öğeden gelen devralınan veri bağlamı) olduğu ve bu bağlam tarafından döndürülen öğe veya koleksiyon daha fazla yol değişikliği gerektirmeden bağlama için uygun olduğu sürece, bağlama bildiriminin hiçbir yan tümcesi olamaz: {Binding}. Bu genellikle bağlamanın bir koleksiyon üzerinde çalıştığı veri stili için belirtildiği yöntemdir. Daha fazla bilgi için bkz . Tüm Nesneleri Bağlama Kaynağı Olarak Kullanma.

  • Varsayılan Mode , bağlı olan bağımlılık özelliğine bağlı olarak tek yönlü ile iki yönlü arasında değişir. Bağlamanızın istenen davranışa sahip olduğundan emin olmak için bağlama modunu istediğiniz zaman açıkça bildirebilirsiniz. Genel olarak, ve RangeBase.Valuegibi kullanıcı tarafından düzenlenebilir denetim özellikleri varsayılan olarak TextBox.Text iki yönlü bağlamalara, ancak diğer özelliklerin çoğu tek yönlü bağlamalara varsayılandır.

  • Varsayılan UpdateSourceTrigger değer, bağlı bağımlılık özelliğine de bağlı olarak ve LostFocus arasında PropertyChanged değişir. Çoğu bağımlılık özelliğinin varsayılan değeri, PropertyChangedözelliği ise TextBox.Text varsayılan değeri olur LostFocus.

Ayrıca bkz.