Przegląd deklaracji wiązań
W tym temacie omówiono różne sposoby deklarowania wiązania.
Warunki 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 jest rozszerzeniem znaczników. 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 są parami Name=Value, w których Name jest nazwą właściwości Binding, a value jest wartością ustawioną 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=PersonName}"/>
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, a także listę właściwości
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 właściwość Foreground przez zadeklarowanie powiązania przy użyciu składni rozszerzenia. Deklaracja powiązania dla właściwości Text 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 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 obiekcie Binding w kodzie. W poniższym przykładzie pokazano, jak utworzyć obiekt Binding i określić właściwości w kodzie. W tym przykładzie TheConverter
jest obiektem implementujący interfejs IValueConverter.
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 wiązany, jest FrameworkElement lub FrameworkContentElement możesz wywołać metodę SetBinding
w obiekcie bezpośrednio zamiast używać BindingOperations.SetBinding. Aby zapoznać się z przykładem, zobacz Create a Binding in Code (Tworzenie powiązania w kodzie).
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 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]"
, 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 klauzula
Path=/
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 można użyć ścieżki oznaczonej kropką (.) do powiązania z bieżącym źródłem. Na przykład
Text="{Binding}"
jest odpowiednikiemText="{Binding Path=.}"
.
Mechanizm ucieczki
Wewnątrz indeksatorów ([ ]) znak karetki (^) unika następnego znaku.
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
&
, aby zastąpić znak „&”.Użyj
>
, 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 (\) sam jest znakiem 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 zwróci
null
.Jeśli nie ustawisz ConverterCulture, aparat powiązań użyje właściwości
Language
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 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:
{Binding}
Jest to często sposób określenia powiązania dla stylu danych, jeżeli powiązanie działa na podstawie kolekcji. Aby uzyskać więcej informacji, zobacz sekcję "Cały obiekt używany jako źródło powiązania" w Binding Sources Overview.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 sterowania edytowalne przez użytkownika, takie jak TextBox.Text i RangeBase.Value, domyślnie mają powiązania dwukierunkowe, natomiast większość innych właściwości domyślnie ma powiązania jednokierunkowe.
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 też
- omówienie powiązania danych
- Tematy poradników
- powiązania danych
- składnia XAML PropertyPath
.NET Desktop feedback