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ü Person
kullanı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ü Person
kullanı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ğininShoppingCart
alt özelliğineOrder
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
olansys
öğesine sahipPath="[(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ümcesiPath=/
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 birOffices
özelliği içeren kaynak koleksiyonun geçerli öğesini belirtir. Geçerli öğesi bir özellik içeren birManagerName
nesnedir.İsteğe bağlı olarak, geçerli kaynağa bağlanmak için nokta (
.
) yolu kullanılabilir. ÖrneğinText="{Binding}"
ileText="{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&
."
>
" bitiş etiketinden kaçmak için kullanın>
.
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ılanen-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.
.NET Desktop feedback