Przegląd Wiązanie deklaracji
W tym temacie omówiono różne sposoby deklarowania powiązania.
Wymagania wstępne
Przed przeczytaniem tego tematu należy zapoznać się z koncepcją i użyciem rozszerzeń znaczników. Aby uzyskać więcej informacji na temat rozszerzeń znaczników, zobacz Rozszerzenia znaczników i WPF XAML.
Ten temat nie obejmuje 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
W tej sekcji omówiono sposób deklarowania powiązania w języku XAML.
Użycie rozszerzenia znaczników
Binding to rozszerzenie znaczników. Gdy używasz rozszerzenia powiązania do deklarowania powiązania, deklaracja składa się z serii klauzul po słowie Binding
kluczowym 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, w których nazwa jest nazwą Binding właściwości, a wartość jest wartością ustawioną dla właściwości.
Podczas tworzenia ciągów deklaracji powiązania w adiustacji muszą one być dołączone do określonej właściwości zależności obiektu docelowego. W poniższym przykładzie pokazano, jak powiązać TextBox.Text właściwość przy użyciu rozszerzenia powiązania, określając Source właściwości i Path .
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>
Większość właściwości Binding klasy można określić w ten sposób. Aby uzyskać więcej informacji na temat rozszerzenia powiązania, a także listę 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 .
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. Jednak w przypadkach, w których 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, należy użyć składni elementu obiektu.
Poniżej przedstawiono przykład składni elementu obiektu i użycia rozszerzenia znaczników:
<TextBlock Name="myconvertedtext"
Foreground="{Binding Path=TheDate,
Converter={StaticResource MyConverterReference}}">
<TextBlock.Text>
<Binding Path="TheDate"
Converter="{StaticResource MyConverterReference}"/>
</TextBlock.Text>
</TextBlock>
Przykład wiąże Foreground właściwość, deklarując powiązanie przy użyciu składni rozszerzenia. Deklaracja powiązania dla Text właściwości używa składni elementu object.
Aby uzyskać więcej informacji na temat różnych terminów, zobacz Składnia XAML w szczegółach.
MultiBinding i PriorityBinding
MultiBinding i PriorityBinding nie obsługują składni rozszerzenia XAML. W związku z tym należy użyć składni elementu object, 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. W poniższym przykładzie pokazano, jak utworzyć Binding obiekt i określić właściwości w kodzie. W tym przykładzie jest obiektem, TheConverter
który implementuje IValueConverter interfejs.
private void OnPageLoaded(object sender, EventArgs e)
{
// Make a new source, to grab a new timestamp
MyData myChangedData = new MyData();
// Create a new binding
// TheDate is a property of type DateTime on MyData class
Binding myNewBindDef = new Binding("TheDate");
myNewBindDef.Mode = BindingMode.OneWay;
myNewBindDef.Source = myChangedData;
myNewBindDef.Converter = TheConverter;
myNewBindDef.ConverterCulture = new CultureInfo("en-US");
// myDatetext is a TextBlock object that is the binding target object
BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);
lbChooseCulture.SelectedIndex = 0;
}
Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
' Make a new source, to grab a new timestamp
Dim myChangedData As New MyData()
' Create a new binding
' TheDate is a property of type DateTime on MyData class
Dim myNewBindDef As New Binding("TheDate")
myNewBindDef.Mode = BindingMode.OneWay
myNewBindDef.Source = myChangedData
myNewBindDef.Converter = TheConverter
myNewBindDef.ConverterCulture = New CultureInfo("en-US")
' myDatetext is a TextBlock object that is the binding target object
BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)
lbChooseCulture.SelectedIndex = 0
End Sub
Jeśli obiekt, który jest powiązaniem FrameworkElement , lub FrameworkContentElement można wywołać SetBinding
metodę bezpośrednio w obiekcie zamiast używać metody BindingOperations.SetBinding. Aby zapoznać się z przykładem, zobacz Tworzenie powiązania w kodzie.
Składnia ścieżki powiązania
Path Użyj właściwości , aby określić wartość źródłową, z którą chcesz powiązać:
W najprostszym przypadku Path wartość właściwości to nazwa 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 podwłaściwość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ć z dołączoną właściwością DockPanel.Dock, składnia to
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, który odpowiada sposobie, w jaki indeksowanie wewnętrzne właściwości obsługuje ciąg literału "0". Indeksatory zagnieżdżone są również obsługiwane.Indeksatory i podwłaściwości mogą być mieszane w klauzuli
Path
, na przykładPath=ShoppingCart.ShippingInfo[MailingAddress,Street].
Wewnątrz indeksatorów można mieć wiele parametrów indeksatora oddzielonych 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]"
element , gdziesys
jest mapowany naSystem
przestrzeń nazw.Gdy źródło jest widokiem kolekcji, bieżący element można określić ukośnikiem (/). Na przykład klauzula
Path=/
ustawia powiązanie na bieżący 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 zawieraOffices
również właściwość, która jest również kolekcją. Jego bieżący element jest obiektem, który zawieraManagerName
właściwość.Opcjonalnie ścieżkę kropki (.) można użyć do powiązania z bieżącym źródłem. Na przykład instrukcja
Text="{Binding}"
jest równoważna instrukcjiText="{Binding Path=.}"
.
Mechanizm ucieczki
Wewnątrz indeksatorów ([ ]) znak karetki (^) unika następnego znaku.
W przypadku ustawienia Path w języku XAML należy również użyć ucieczki (przy użyciu jednostek XML) określonych znaków specjalnych dla definicji języka XML:
Użyj
&
polecenia , aby uciec od znaku "&".Użyj
>
polecenia , aby uniknąć tagu końcowego ">".
Ponadto w przypadku opisania całego powiązania w atrybucie przy użyciu składni rozszerzenia znaczników należy użyć znaków ucieczki (przy użyciu ukośnika odwrotnego \), które są specjalne dla analizatora rozszerzeń 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 (}) jest końcem rozszerzenia znaczników.
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 zwraca wartość
null
.Jeśli nie zostanie ustawiona ConverterCulture, aparat powiązania używa
Language
właściwości obiektu docelowego powiązania. W języku XAML ta wartość domyślna to "en-US" lub 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 cokolwiek element lub kolekcja zwracana przez ten kontekst jest odpowiednia do powiązania bez konieczności dalszej modyfikacji ścieżki, deklaracja powiązania w ogóle nie może mieć żadnych klauzul:
{Binding}
Często jest to sposób, w jaki powiązanie jest określone dla stylu danych, jeżeli powiązanie działa na podstawie kolekcji. Aby uzyskać więcej informacji, zobacz sekcję "Entire Objects Used as a Binding Source" (Całe obiekty używane jako źródło powiązania) w temacie Binding Sources Overview (Omówienie źródeł powiązań).Wartość domyślna Mode różni się w zależności od powiązanej właściwości zależności jednokierunkowej i dwukierunkowej. 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, natomiast większość innych właściwości domyślnie do powiązań jednokierunkowych.
Wartość domyślna UpdateSourceTrigger różni się również w LostFocusPropertyChanged 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 TextBox.Text właściwość ma wartość LostFocusdomyślną .
Zobacz też
.NET Desktop feedback
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla