Udostępnij za pośrednictwem


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ści ShoppingCart.

  • 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ład Path=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 , gdzie sys jest mapowany na System 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 zawiera Offices również właściwość, która jest również kolekcją. Jego bieżący element jest obiektem, który zawiera ManagerName 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 instrukcji Text="{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 &amp; polecenia , aby uciec od znaku "&".

    • Użyj &gt; 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ż