Bağlama bildirimlerine genel bakış (WPF .NET)
Genellikle, geliştiriciler bağlamaları doğrudan veri bağlamak istedikleri Kullanıcı arabirimi öğelerinin XAML biçimlendirmesinde bildirir. Ancak, koddaki bağlamaları da bildirebilirsiniz. Bu makalede, hem XAML 'de hem de kodda bağlamaların nasıl bildirildiği açıklanır.
Önkoşullar
Bu makaleyi okumadan önce, biçimlendirme uzantılarının kavram ve kullanımı hakkında bilgi sahibi olmanız önemlidir. Biçimlendirme uzantıları hakkında daha fazla bilgi için bkz. Biçimlendirme uzantıları 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 biçimlendirme uzantısıdır. Bağlamayı bildirmek için bağlama uzantısını kullandığınızda, bildirim, Binding anahtar sözcüğünü izleyen ve virgüllerle (,) ayrılmış bir dizi yan tümce oluşur. Bağlama bildirimindeki yan tümceler herhangi bir sırada olabilir ve birçok olası bileşim vardır. Yan tümceler addeğer çiftleridir; burada ad özelliğin adıdır ve değer özellik için ayarladığınız değerdir.
Biçimlendirme içinde bağlama bildirimi dizeleri oluştururken, bir hedef nesnenin belirli bağımlılık özelliğine eklenmelidir. Aşağıdaki örnek, TextBox.Text ve özelliklerini belirterek bağlama uzantısı kullanılarak özelliğin nasıl bağlanacağını gösterir SourcePath .
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
BindingBu şekilde sınıfın özelliklerinin çoğunu belirtebilirsiniz. bağlama uzantısı ve Binding bağlama uzantısı kullanılarak ayarlanamaz özelliklerin listesi hakkında daha fazla bilgi için bkz. Binding genel bakış.
Nesne öğesi sözdizimi
Nesne öğesi sözdizimi, bağlama bildirimi oluşturmak için bir alternatiftir. Çoğu durumda, biçimlendirme uzantısı ya da nesne öğesi söz dizimi kullanmanın belirli bir avantajı yoktur. Ancak, biçimlendirme uzantısı senaryonuzu desteklemiyorsa (örneğin, özellik değeri hiçbir tür dönüştürmesi bulunmayan bir dize olmayan türde olduğunda) nesne öğesi söz dizimini kullanmanız gerekir.
Önceki bölümde bir XAML uzantısının nasıl bağlanacağı gösterilmiştir. Aşağıdaki örnek, aynı bağlamayı, ancak nesne öğesi söz dizimini kullandığını gösterir:
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
Farklı terimler hakkında daha fazla bilgi için bkz. XAML sözdizimi ayrıntılı (.NET Framework).
MultiBinding ve PriorityBinding
MultiBinding ve PriorityBinding xaml uzantısı söz dizimini desteklemez. MultiBindingXAML içinde bir veya olan bildiriyorsanız, bu nedenle nesne öğesi söz dizimini kullanmanız gerekir PriorityBinding .
Kodda bağlama oluşturma
Bağlama belirtmenin başka bir yolu da doğrudan kodda bir nesne üzerinde özellikler ayarlamak Binding ve sonra bağlamayı bir özelliğe atar. Aşağıdaki örnek, kodda bir nesne oluşturmayı gösterir Binding .
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ğı nesnesindeki özelliğin yolu.
- Bağlamanın modu.
- Bu durumda, bir kişiyi temsil eden basit bir nesne örneği olan veri kaynağı.
- 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 bir olduğunda FrameworkContentElement , SetBinding yöntemini kullanmak yerine doğrudan nesneniz üzerinde çağırabilirsiniz BindingOperations.SetBinding . Bir örnek için bkz. nasıl yapılır: kod Içinde bağlama oluşturma.
Önceki örnekte basit bir veri nesnesi türü kullanılmaktadır Person . Bu nesnenin kodu aşağıda verilmiştir:
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özdizimi
Bağlamak istediğiniz Path 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
Path=PropertyName.Özelliğin alt özellikleri, C# ' de olduğu gibi benzer bir sözdizimi ile belirtilebilir. Örneğin, yan tümce
Path=ShoppingCart.Ordernesnenin veya özelliğin alt özelliğine bağlamayı ayarlarOrderShoppingCart.Ekli özelliğe bağlamak için iliştirilmiş özelliğin çevresine parantez koyun. Örneğin, ekli özelliğe bağlamak için DockPanel.Dock sözdizimi olur
Path=(DockPanel.Dock).Bir özelliğin Dizin oluşturucular, dizin oluşturucunun uygulandığı özellik adından sonra köşeli ayraç içinde belirtilebilir. Örnek olarak, yan tümce,
Path=ShoppingCart[0]özelliğinin iç dizin oluşturma işleminin "0" değişmez dizesini nasıl işleyimine karşılık gelen dizine bağlamayı ayarlar. İç içe dizinleyiciler de desteklenir.Dizin oluşturucular ve alt özellikler yan tümce içinde karışık olabilir
Path; Örneğin,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].İçindeki dizin oluşturucular. Birden çok Dizin Oluşturucu parametreye virgülle () ayırarak sahip olabilirsiniz
,. Her parametrenin türü parantez ile belirtilebilir. Örneğin,Path="[(sys:Int32)42,(sys:Int32)24]"sysad alanıyla eşlenmiş olan ' yi kullanabilirsinizSystem.Kaynak bir koleksiyon görünümü olduğunda, geçerli öğe eğik çizgiyle (
/) belirlenebilir. Örneğin, yan tümcePath=/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 özellikleri çapraz gezmek için birleştirilebilir. Örneğin,
Path=/Offices/ManagerNameOfficesaynı zamanda bir koleksiyon olan bir özelliği içeren kaynak koleksiyonun geçerli öğesini belirtir. Geçerli öğesi, özelliği içeren bir nesnedirManagerName.İsteğe bağlı olarak,
.geçerli kaynağa bağlamak için bir nokta () yolu kullanılabilir. ÖrneğinText="{Binding}"ileText="{Binding Path=.}"eşdeğerdir.
Kaçış mekanizması
Dizin oluşturucular (
[ ]) içinde, giriş işareti karakteri (^) sonraki karakteri çıkar.PathXaml 'de ayarlarsanız, XML dil tanımına özel olan belirli karakterler de (xml varlıkları kullanarak) kaçış yapmanız gerekir:
&"" Karakterini atlamak için kullanın&.>"" Bitiş etiketini atlamak için kullanın>.
Ayrıca, biçimlendirme uzantısı söz dizimini kullanarak bir öznitelikte tüm bağlamayı açıklamanız halinde,
\WPF işaretleme uzantısı ayrıştırıcısına özel olan karakterler (ters eğik çizgi kullanarak) kaçış yapmanız gerekir:Ters eğik çizgi (
\), kaçış karakteridir.Eşittir işareti (
=) özellik değerinden özellik adını ayırır.Virgül (
,) özellikleri ayırır.Sağ küme ayracı (
}), biçimlendirme uzantısının sonu.
Bağlama yönü
Binding.ModeBağlamanın 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 | Target özelliği ya da Source özelliği değiştiğinde Target özelliğini veya özelliğini güncelleştirir. |
| BindingMode.OneWay | Hedef özelliği yalnızca kaynak özelliği değiştiğinde güncelleştirir. |
| BindingMode.OneTime | Hedef özelliği yalnızca uygulama başladığında veya DataContext bir değişikliğe uğradığında güncelleştirir. |
| BindingMode.OneWayToSource | Target özelliği değiştiğinde kaynak özelliğini güncelleştirir. |
| BindingMode.Default | ModeHedef özelliğin varsayılan değerinin kullanılmasına neden olur. |
Daha fazla bilgi için bkz BindingMode . sabit listesi.
Aşağıdaki örnekte, özelliğinin nasıl ayarlanacağı gösterilmektedir Mode :
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
Kaynak değişiklikleri (ve bağlamaları için geçerlidir OneWay ) algılamak için TwoWay , kaynak gibi uygun bir özellik değişikliği bildirim mekanizması gerçekleştirmelidir INotifyPropertyChanged . Daha fazla bilgi için bkz. değişiklik bildirimleri sağlama.
TwoWayVeya OneWayToSource bağlamaları için, özelliği ayarlayarak kaynak güncelleştirmelerinin zamanlamasını denetleyebilirsiniz UpdateSourceTrigger . Daha fazla bilgi için bkz. UpdateSourceTrigger.
Varsayılan davranışlar
Bildirimde belirtilmemişse varsayılan davranış aşağıdaki gibidir:
Bağlama kaynak değeri ile bağlama hedefi değeri arasında tür dönüştürmesi yapmaya çalışan bir varsayılan dönüştürücü oluşturulur. Bir dönüştürme yapılamaz, varsayılan dönüştürücü döndürür
null.Ayarlamazsanız ConverterCulture , bağlama altyapısı
Languagebağlama hedef nesnesinin özelliğini kullanır. XAML 'de, bu varsayılan olarak,en-USbir değeri açıkça ayarlandıysa, sayfanın kök öğesi (veya herhangi bir öğesi) değerini alır veya devralır.Bağlama zaten bir veri bağlamına sahip olduğu sürece (örneğin, bir üst öğeden gelen devralınan veri bağlamı) ve bu bağlam tarafından döndürülen herhangi bir öğe veya koleksiyon, daha fazla yol değişikliği gerektirmeden bağlama için uygun olduğunda, bir bağlama bildiriminde hiçbir yan tümce bulunamaz:
{Binding}. Bu, genellikle bağlamanın bir koleksiyon üzerinde çalıştığı veri stili için bir bağlamanın belirtilme yoludur. Daha fazla bilgi için bkz. tüm nesneleri bağlama kaynağı olarak kullanma.Varsayılan Mode değer, bağlı olan bağımlılık özelliğine bağlı olarak tek yollu ve iki yollu arasında değişir. Bağlamanızı istediğiniz davranışa sahip olduğundan emin olmak için bağlama modunu her zaman açıkça bildirebilirsiniz. Genel olarak, ve gibi kullanıcı tarafından düzenlenebilir denetim özellikleri, iki yollı bağlamalara, diğer çoğu özellik ise tek yol TextBox.TextRangeBase.Value bağlamaya varsayılandır.
Varsayılan UpdateSourceTrigger değer ile arasında, PropertyChanged bağlı bağımlılık LostFocus özelliğine bağlı olarak da değişir. Çoğu bağımlılık özelliği için varsayılan değer , PropertyChanged özelliği TextBox.Text ise varsayılan değerine LostFocus sahiptir.