Udostępnij za pośrednictwem


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 , których nie można ustawić przy użyciu rozszerzenia powiązania, zobacz Binding Markup Extension overview (Rozszerzenie powiązania).

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ś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ć 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ł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]", gdzie sys jest przypisany do przestrzeni nazw System.

  • 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 odpowiednikiem Text="{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 &amp;, aby zastąpić znak „&”.

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