Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zazwyczaj deweloperzy deklarują powiązania bezpośrednio w znacznikach XAML elementów interfejsu użytkownika, z którymi chcą powiązać dane. Można jednak również zadeklarować powiązania w kodzie. W tym artykule opisano sposób deklarowania powiązań zarówno w języku XAML, jak i w kodzie.
Wymagania wstępne
Przed przeczytaniem tego artykułu ważne jest, aby zapoznać się z koncepcją i użyciem rozszerzeń znaczników. Aby uzyskać więcej informacji na temat rozszerzeń znaczników, zobacz sekcje Rozszerzenia znaczników iWPF XAML.
W tym artykule nie omówiono pojęć związanych z powiązaniem danych. Aby zapoznać się z omówieniem pojęć związanych z powiązaniem danych, zobacz Omówienie powiązania danych.
Deklarowanie powiązania w języku XAML
Binding jest rozszerzeniem znacznikowym. Gdy używasz rozszerzenia powiązania do deklarowania powiązania, deklaracja składa się z serii klauzul po słowie kluczowym Binding
i rozdzielonych przecinkami (,). Klauzule w deklaracji powiązania mogą być w dowolnej kolejności i istnieje wiele możliwych kombinacji. Klauzule to pary Name=Value , gdzie Name jest nazwą Binding właściwości, a Wartość jest wartością ustawianą dla właściwości.
Podczas tworzenia ciągów deklaracji wiązania w znacznikach muszą one być przypisane do określonej właściwości zależności obiektu docelowego. W poniższym przykładzie pokazano, jak powiązać właściwość TextBox.Text przy użyciu rozszerzenia powiązania, określając właściwości Source i Path.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
W poprzednim przykładzie użyto prostego Person
typu obiektu danych . Poniższy fragment kodu to kod dla tego obiektu:
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
W ten sposób można określić większość właściwości klasy Binding. Aby uzyskać więcej informacji na temat rozszerzenia powiązania i listy Binding właściwości, których nie można ustawić przy użyciu rozszerzenia powiązania, zobacz Omówienie rozszerzenia powiązania znaczników (.NET Framework).
Aby zapoznać się z przykładem tworzenia powiązania w języku XAML, zobacz Jak utworzyć powiązanie danych.
Składnia elementu object
Składnia elementu object jest alternatywą dla tworzenia deklaracji powiązania. W większości przypadków nie ma żadnej konkretnej korzyści z używania rozszerzenia znaczników lub składni elementu obiektu. Jeśli jednak rozszerzenie znaczników nie obsługuje twojego scenariusza, na przykład gdy wartość właściwości jest typu innego niż ciąg, dla którego nie istnieje konwersja typu, musisz użyć składni elementu obiektu.
W poprzedniej sekcji pokazano, jak powiązać z rozszerzeniem XAML. W poniższym przykładzie pokazano wykonywanie tego samego powiązania, ale używa składni elementu obiektu:
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
Aby uzyskać więcej informacji na temat różnych terminów, zobacz Składnia XAML w szczegółach (.NET Framework).
MultiBinding i PriorityBinding
MultiBinding i PriorityBinding nie obsługują składni rozszerzenia XAML. Dlatego należy użyć składni elementu obiektu, jeśli deklarujesz MultiBinding element lub PriorityBinding w języku XAML.
Tworzenie powiązania w kodzie
Innym sposobem określenia powiązania jest ustawienie właściwości bezpośrednio na Binding obiekcie w kodzie, a następnie przypisanie powiązania do właściwości. W poniższym przykładzie pokazano, jak utworzyć Binding obiekt w kodzie.
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
Poprzedni kod ustawił następujące elementy w powiązaniu:
- Ścieżka właściwości obiektu źródła danych.
- Tryb powiązania.
- W tym przypadku źródło danych to proste wystąpienie obiektu reprezentujące osobę.
- Opcjonalny konwerter, który przetwarza wartość pochodzącą z obiektu źródła danych przed przypisaną do właściwości docelowej.
Gdy obiekt, który jest powiązaniem, jest elementem FrameworkElementFrameworkContentElementlub , możesz wywołać SetBinding
metodę bezpośrednio w obiekcie, zamiast używać metody BindingOperations.SetBinding. Aby zapoznać się z przykładem, zobacz How to: Create a Binding in Code (Instrukcje: tworzenie powiązania w kodzie).
W poprzednim przykładzie użyto prostego Person
typu obiektu danych . Poniżej znajduje się kod dla tego obiektu:
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
Składnia ścieżki powiązania
Użyj właściwości Path, aby określić wartość źródłową, z którą chcesz powiązać:
W najprostszym przypadku wartość właściwości Path jest nazwą właściwości obiektu źródłowego do użycia dla powiązania, na przykład
Path=PropertyName
.Podwłaściwości właściwości można określić za pomocą podobnej składni, jak w języku C#. Na przykład klauzula
Path=ShoppingCart.Order
ustawia powiązanie na właściwość podrzędnąOrder
obiektu lub właściwościShoppingCart
.Aby powiązać z dołączoną właściwością, umieść nawiasy wokół dołączonej właściwości. Na przykład, aby powiązać się z dołączoną właściwością DockPanel.Dock, używa się składni
Path=(DockPanel.Dock)
.Indeksatory właściwości można określić w nawiasach kwadratowych po nazwie właściwości, w której jest stosowany indeksator. Na przykład klauzula
Path=ShoppingCart[0]
ustawia powiązanie na indeks odpowiadający temu, jak wewnętrzne indeksowanie właściwości obsługuje ciąg znaków "0". Indeksatory zagnieżdżone są również obsługiwane.Indeksatory i podwłaściwości mogą być stosowane razem w klauzuli
Path
, na przykładPath=ShoppingCart.ShippingInfo[MailingAddress,Street].
Wewnątrz indeksatorów. Można mieć wiele parametrów indeksatora rozdzielonych przecinkami (
,
). Typ każdego parametru można określić za pomocą nawiasów. Na przykład możesz miećPath="[(sys:Int32)42,(sys:Int32)24]"
, gdziesys
jest przypisany do przestrzeni nazwSystem
.Gdy źródło jest widokiem kolekcji, bieżący element można określić ukośnikiem (
/
). Na przykład klauzulaPath=/
ustawia powiązanie na aktualny element w widoku. Gdy źródło jest kolekcją, ta składnia określa bieżący element domyślnego widoku kolekcji.Nazwy właściwości i ukośniki można łączyć w celu przechodzenia przez właściwości, które są kolekcjami. Na przykład
Path=/Offices/ManagerName
określa bieżący element kolekcji źródłowej, który zawiera właściwośćOffices
, która jest również kolekcją. Jego bieżącym elementem jest obiekt, który zawiera właściwośćManagerName
.Opcjonalnie ścieżkę kropki (
.
) można użyć do powiązania z bieżącym źródłem. Na przykładText="{Binding}"
jest odpowiednikiemText="{Binding Path=.}"
.
Mechanizm ucieczki
Wewnątrz indeksatorów (
[ ]
) znak karetki (^
) ucieka przed następnym znakiem.Jeśli ustawisz Path w XAML, musisz również zneutralizować (przy użyciu encji XML) pewne znaki specjalne w ramach definicji języka XML.
Użyj
&
polecenia , aby uciec od znaku "&
".Użyj
>
, aby uniknąć tagu końcowego ">
".
Ponadto, jeśli opisano całe powiązanie w atrybucie przy użyciu składni rozszerzenia znaczników, należy użyć ucieczki (przy użyciu ukośnika
\
odwrotnego ) znaków specjalnych dla analizatora rozszerzenia znaczników WPF:Ukośnik odwrotny (
\
) to sam znak ucieczki.Znak równości (
=
) oddziela nazwę właściwości od wartości właściwości.Przecinek (
,
) oddziela właściwości.Prawy nawias klamrowy (
}
) to koniec rozszerzenia znaczników.
Kierunek wiązania
Użyj właściwości , Binding.Mode aby określić kierunek powiązania. Dostępne są następujące tryby aktualizacji powiązań:
Tryb wiązania | Opis |
---|---|
BindingMode.TwoWay | Aktualizuje właściwość docelową lub właściwość za każdym razem, gdy zmienia się właściwość docelowa lub właściwość źródłowa. |
BindingMode.OneWay | Aktualizuje właściwość docelową tylko wtedy, gdy zmienia się właściwość źródłowa. |
BindingMode.OneTime | Aktualizuje właściwość docelową tylko wtedy, gdy aplikacja zostanie uruchomiona lub gdy zostanie zmieniona DataContext . |
BindingMode.OneWayToSource | Aktualizuje właściwość źródłową, gdy zmienia się właściwość docelowa. |
BindingMode.Default | Powoduje, że wartość domyślna Mode właściwości docelowej ma być używana. |
Aby uzyskać więcej informacji, zobacz wyliczenie BindingMode.
W poniższym przykładzie pokazano, jak ustawić Mode właściwość:
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
Aby wykryć zmiany źródła (dotyczy powiązań OneWay i TwoWay), źródło musi zaimplementować odpowiedni mechanizm powiadamiania o zmianie właściwości, taki jak INotifyPropertyChanged. Aby uzyskać więcej informacji, zobacz Zapewnianie powiadomień o zmianach.
W przypadku powiązań TwoWay lub OneWayToSource można kontrolować czas aktualizacji źródłowych, ustawiając właściwość UpdateSourceTrigger. Aby uzyskać więcej informacji, zobacz UpdateSourceTrigger.
Domyślne zachowania
Domyślne zachowanie jest następujące, jeśli nie zostanie określone w deklaracji:
Tworzony jest domyślny konwerter, który próbuje wykonać konwersję typu między wartością źródłową powiązania a wartością docelową powiązania. Jeśli nie można dokonać konwersji, konwerter domyślny zwróci
null
.Jeśli nie ustawisz ConverterCultureparametru , aparat powiązania używa
Language
właściwości obiektu docelowego powiązania. W języku XAML to ustawienie domyślne luben-US
dziedziczy wartość z elementu głównego (lub dowolnego elementu) strony, jeśli została jawnie ustawiona.Jeśli powiązanie ma już kontekst danych (na przykład odziedziczony kontekst danych pochodzący z elementu nadrzędnego), a dowolny element lub kolekcja zwracana przez ten kontekst jest odpowiednia do powiązania bez konieczności dalszej modyfikacji ścieżki, deklaracja powiązania nie może mieć żadnych klauzul w ogóle:
{Binding}
. Jest to często sposób określenia powiązania dla stylu danych, w którym powiązanie działa na kolekcji. Aby uzyskać więcej informacji, zobacz Używanie całych obiektów jako źródła powiązania.Domyślny Mode różni się między powiązaniem jednokierunkowym a dwukierunkowym w zależności od właściwości zależności, która jest powiązana. Zawsze możesz jawnie zadeklarować tryb powiązania, aby upewnić się, że powiązanie ma żądane zachowanie. Ogólnie rzecz biorąc, właściwości kontrolki z możliwością edycji użytkownika, takie jak TextBox.Text i RangeBase.Value, domyślnie do powiązań dwukierunkowych, ale większość innych właściwości domyślnie do powiązań jednokierunkowych.
Domyślna wartość UpdateSourceTrigger różni się między PropertyChanged a LostFocus w zależności od powiązanej właściwości zależności. Wartość domyślna dla większości właściwości zależności to PropertyChanged, a właściwość TextBox.Text ma domyślną wartość LostFocus.
Zobacz także
- Omówienie powiązania danych
- Omówienie źródeł powiązań
- Jak utworzyć powiązanie danych
- PropertyPath XAML Syntax (.NET Framework)
.NET Desktop feedback