Udostępnij przez


Rozszerzenie znaczników {x:Bind}

Uwaga Aby uzyskać ogólne informacje na temat używania powiązania danych w aplikacji z {x:Bind} (oraz porównanie {x:Bind} i {Binding}), zobacz Zaawansowane powiązania danych.

Rozszerzenie znaczników {x:Bind} — nowe w systemie Windows 10 — jest alternatywą dla {Binding}. Program {x:Bind} działa w krótszym czasie i mniej pamięci niż {Binding} i obsługuje lepsze debugowanie.

W czasie kompilacji XAML {x:Bind} jest konwertowane na kod, który pobierze wartość z właściwości w źródle danych i ustawi ją we właściwości określonej w znaczniku. Obiekt powiązania można opcjonalnie skonfigurować tak, aby obserwować zmiany w wartości właściwości źródła danych i odświeżać się na podstawie tych zmian (Mode="OneWay"). Można również skonfigurować opcjonalnie tak, aby zmiany jego wartości były przesyłane z powrotem do właściwości źródłowej (Mode="TwoWay").

Obiekty powiązania utworzone przez element {x:Bind} i {Binding} są w dużej mierze równoważne funkcjonalnie. Jednak program {x:Bind} wykonuje kod specjalnego przeznaczenia, który generuje w czasie kompilacji, a element {Binding} używa inspekcji obiektów środowiska uruchomieniowego ogólnego przeznaczenia. W związku z tym powiązania {x:Bind} (często określane jako skompilowane powiązania) mają doskonałą wydajność, zapewniają walidację czasu kompilacji w wyrażeniach powiązań i obsługują debugowanie, umożliwiając ustawianie punktów przerwania w plikach kodu generowanych jako klasa częściowa dla strony. Te pliki można znaleźć w folderze obj z nazwami takimi jak (dla języka C#). <view name>.g.cs

Wskazówka

Element {x:Bind} ma domyślny tryb OneTime, w przeciwieństwie do { Binding}, który ma domyślny tryb OneWay. Została wybrana ze względów wydajności, ponieważ użycie usługi OneWay powoduje wygenerowanie większej liczby kodu w celu podłączenia i obsługi wykrywania zmian. Możesz jawnie określić tryb używania powiązania OneWay lub TwoWay. Możesz również użyć elementu x:DefaultBindMode , aby zmienić tryb domyślny dla elementu {x:Bind} dla określonego segmentu drzewa znaczników. Określony tryb ma zastosowanie do dowolnych wyrażeń {x:Bind} w tym elemencie i jego elementach podrzędnych, które nie określają jawnie trybu w ramach powiązania.

Użycie atrybutu XAML

<object property="{x:Bind}" .../>
-or-
<object property="{x:Bind propertyPath}" .../>
-or-
<object property="{x:Bind bindingProperties}" .../>
-or-
<object property="{x:Bind propertyPath, bindingProperties}" .../>
-or-
<object property="{x:Bind pathToFunction.functionName(functionParameter1, functionParameter2, ...), bindingProperties}" .../>
Termin Description
propertyPath Ciąg określający ścieżkę właściwości powiązania. Więcej informacji znajduje się w sekcji Ścieżka właściwości poniżej.
bindingProperties
propName=value[, propName=value]* Co najmniej jedna właściwość powiązania określona za pomocą składni pary nazwa/wartość.
propName Nazwa właściwości w formacie ciągu do ustawienia na obiekcie powiązania. Na przykład "Konwerter".
wartość Wartość, na która ma być ustawiona właściwość . Składnia argumentu zależy od ustawianej właściwości. Oto przykład użycia propName=value, w którym wartość jest rozszerzeniem samego znacznika: Converter={StaticResource myConverterClass}. Aby uzyskać więcej informacji, zobacz sekcję Właściwości, które można ustawić za pomocą poniższej sekcji {x:Bind} .

Przykłady

<Page x:Class="QuizGame.View.HostView" ... >
    <Button Content="{x:Bind Path=ViewModel.NextButtonText, Mode=OneWay}" ... />
</Page>

W tym przykładzie język XAML używa właściwości {x:Bind} z właściwością ListView.ItemTemplate . Zanotuj deklarację wartości x:DataType .

  <DataTemplate x:Key="SimpleItemTemplate" x:DataType="data:SampleDataGroup">
    <StackPanel Orientation="Vertical" Height="50">
      <TextBlock Text="{x:Bind Title}"/>
      <TextBlock Text="{x:Bind Description}"/>
    </StackPanel>
  </DataTemplate>

Ścieżka właściwości

WłaściwośćPath ustawia ścieżkę dla wyrażenia {x:Bind} . Ścieżka to ścieżka właściwości określająca wartość właściwości, podwłaściwości, pola lub metody, z którą jest wiązane (źródło). Możesz jawnie wspomnieć nazwę właściwości Path : {x:Bind Path=...}. Możesz też pominąć to: {x:Bind ...}.

Rozpoznawanie ścieżki właściwości

Element {x:Bind} nie używa elementu DataContext jako domyślnego źródła — zamiast tego używa samej strony lub kontrolki użytkownika. W ten sposób będzie ona wyglądać w kodzie strony lub kontrolki użytkownika pod kątem właściwości, pól i metod. Aby uwidocznić model widoku dla {x:Bind}, zazwyczaj chcesz dodać nowe pola lub właściwości do kodu związanego z twoją stroną lub kontrolką użytkownika. Kroki w ścieżce właściwości są rozdzielane kropkami (.) i można uwzględnić wiele ograniczników w celu przechodzenia kolejnych właściwości podrzędnych. Użyj ogranicznika kropkowego niezależnie od języka programowania używanego do implementowania obiektu powiązanego z.

Na przykład: na stronie Text="{x:Bind Employee.FirstName}" wyszuka członka Employee na stronie, a następnie członka FirstName w obiekcie zwróconym przez Employee. W przypadku powiązania kontrolki elementów z właściwością, która zawiera osoby na utrzymaniu pracownika, ścieżka właściwości może być "Employee.Dependents", a szablon elementu kontrolki elementów zajmie się wyświetlaniem elementów w "Dependents".

W przypadku języka C++/CX program {x:Bind} nie może powiązać z polami prywatnymi i właściwościami na stronie lub modelu danych — musisz mieć właściwość publiczną, aby mogła być powiązana. Obszar powierzchni dla powiązania musi być uwidoczniony jako klasy/interfejsy CX, aby można było uzyskać odpowiednie metadane. Atrybut [Bindable] nie powinien być wymagany.

W przypadku elementu x:Bind nie trzeba używać elementu ElementName=xxx w ramach wyrażenia powiązania. Zamiast tego można użyć nazwy elementu jako pierwszej części ścieżki dla powiązania, ponieważ nazwane elementy stają się polami w obrębie strony lub kontrolki użytkownika, która reprezentuje źródło powiązania głównego.

Collections

Jeśli źródło danych jest kolekcją, ścieżka właściwości może określać elementy w kolekcji według ich pozycji lub indeksu. Na przykład "Teams[0].Players", gdzie nawiasy "[]" otaczają wartość "0", która określa pierwszy element w kolekcji indeksowanej od zera.

Aby użyć indeksatora, model musi zaimplementować IList<T> lub IVector<T> dla typu właściwości, która ma być indeksowana. (Zwróć uwagę, że IReadOnlyList<T> i IVectorView<T> nie obsługują składni indeksatora. Jeśli typ właściwości indeksowanej obsługuje właściwość INotifyCollectionChanged lub IObservableVector , a powiązanie to OneWay lub TwoWay, następnie zarejestruje i nasłuchuje powiadomień o zmianach w tych interfejsach. Logika wykrywania zmian zostanie zaktualizowana na podstawie wszystkich zmian kolekcji, nawet jeśli nie wpłynie to na określoną wartość indeksowaną. Dzieje się tak, ponieważ logika nasłuchiwania jest wspólna dla wszystkich instancji kolekcji.

Jeśli źródło danych jest słownikiem lub mapą, ścieżka właściwości może określać elementy w kolekcji według ich nazwy ciągu. Na przykład <TextBlock Text="{x:Bind Players['John Smith']}" /> wyszuka element w słowniku o nazwie "John Smith". Nazwa musi być ujęta w cudzysłów, a można użyć cudzysłowów pojedynczych lub podwójnych. Hat (^) może służyć do ucieczki cudzysłowów w ciągach. Zwykle najłatwiej jest użyć cudzysłowów alternatywnych, zamiast tych, które są używane dla atrybutu XAML. (Należy pamiętać, że IReadOnlyDictionary<T> i IMapView<T> nie obsługują składni indeksatora.

Aby użyć indeksatora ciągów, model musi zaimplementować ciąg IDictionary<, ciąg T> lub IMap<, T> dla typu właściwości, która ma być indeksowana. Jeśli typ właściwości indeksowanej obsługuje IObservableMap, a powiązanie jest typu OneWay lub TwoWay, zostanie zarejestrowane i będzie nasłuchiwać powiadomień o zmianach na tych interfejsach. Logika wykrywania zmian zostanie zaktualizowana na podstawie wszystkich zmian kolekcji, nawet jeśli nie wpłynie to na określoną wartość indeksowaną. Dzieje się tak, ponieważ logika nasłuchiwania jest jednakowa dla wszystkich elementów kolekcji.

Dołączone właściwości

Aby powiązać z właściwościami dołączonymi, należy umieścić klasę i nazwę właściwości w nawiasach po kropce. Na przykład Text="{x:Bind Button22.(Grid.Row)}". Jeśli właściwość nie jest zadeklarowana w przestrzeni nazw Xaml, należy ją prefiksować z przestrzenią nazw XML, którą należy zamapować na przestrzeń nazw kodu w nagłówku dokumentu.

Casting

Skompilowane powiązania są silnie typizowane i określą typ każdego kroku w ścieżce. Jeśli zwrócony typ nie ma składowej, zakończy się niepowodzeniem w czasie kompilacji. Można określić rzutowanie, aby powiązać rzeczywisty typ obiektu.

W poniższym przypadku obj jest właściwością typu object, ale zawiera pole tekstowe, więc możemy użyć Text="{x:Bind ((TextBox)obj).Text}" lub Text="{x:Bind obj.(TextBox.Text)}".

Pole groups3 w elemencie Text="{x:Bind ((data:SampleDataGroup)groups3[0]). Title}" to słownik obiektów, więc należy go rzutować na data:SampleDataGroup. Zwróć uwagę na użycie prefiksu przestrzeni nazw XML data: do mapowania typu obiektu na przestrzeń nazw kodu, która nie jest częścią domyślnej przestrzeni nazw XAML.

Uwaga: Składnia rzutowania w stylu C# jest bardziej elastyczna niż składnia właściwości dołączonych i jest zalecaną składnią w przyszłości.

Rzutowanie bez ścieżki

Natywny analizator powiązania nie udostępnia słowa kluczowego do reprezentowania this jako parametr funkcji, ale obsługuje rzutowanie bez ścieżki (na przykład {x:Bind (x:String)}), które może być używane jako parametr funkcji. {x:Bind MethodName((namespace:TypeOfThis))} jest więc prawidłowym sposobem wykonania tego, co jest koncepcyjnie równoważne{x:Bind MethodName(this)}.

Przykład:

Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}"

<Page
    x:Class="AppSample.MainPage"
    ...
    xmlns:local="using:AppSample">

    <Grid>
        <ListView ItemsSource="{x:Bind Songs}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:SongItem">
                    <TextBlock
                        Margin="12"
                        FontSize="40"
                        Text="{x:Bind local:MainPage.GenerateSongTitle((local:SongItem))}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>
namespace AppSample
{
    public class SongItem
    {
        public string TrackName { get; private set; }
        public string ArtistName { get; private set; }

        public SongItem(string trackName, string artistName)
        {
            ArtistName = artistName;
            TrackName = trackName;
        }
    }

    public sealed partial class MainPage : Page
    {
        public List<SongItem> Songs { get; }
        public MainPage()
        {
            Songs = new List<SongItem>()
            {
                new SongItem("Track 1", "Artist 1"),
                new SongItem("Track 2", "Artist 2"),
                new SongItem("Track 3", "Artist 3")
            };

            this.InitializeComponent();
        }

        public static string GenerateSongTitle(SongItem song)
        {
            return $"{song.TrackName} - {song.ArtistName}";
        }
    }
}

Funkcje w ścieżkach powiązań

Począwszy od systemu Windows 10, wersja 1607, aplikacja {x:Bind} obsługuje używanie funkcji jako kroku liścia ścieżki powiązania. Jest to zaawansowana funkcja powiązań danych, która umożliwia kilka scenariuszy w znacznikach. Aby uzyskać szczegółowe informacje, zobacz powiązania funkcji .

Powiązanie zdarzeń

Powiązanie zdarzeń to unikatowa funkcja powiązania skompilowanego. Umożliwia określenie procedury obsługi dla zdarzenia przy użyciu powiązania, a nie konieczności stosowania metody w kodzie. Na przykład: Click="{x:Bind rootFrame.GoForward}".

W przypadku zdarzeń metoda docelowa nie może być przeciążona i musi również spełniać następujące warunki:

  • Dopasuj podpis zdarzenia.
  • LUB nie mają parametrów.
  • LUB mają taką samą liczbę parametrów typów, które można przypisać z typów parametrów zdarzenia.

W wygenerowanym kodzie skompilowane powiązanie obsługuje zdarzenie i kieruje je do metody w modelu, oceniając ścieżkę wyrażenia powiązania w przypadku wystąpienia zdarzenia. Oznacza to, że w przeciwieństwie do powiązań właściwości nie śledzi zmian w modelu.

Aby uzyskać więcej informacji na temat składni ciągu dla ścieżki właściwości, zobacz Składnia ścieżki właściwości, pamiętając o różnicach opisanych tutaj dla elementu {x:Bind}.

Właściwości, które można ustawić za pomocą elementu {x:Bind}

{x:Bind} jest zilustrowane za pomocą składni symbolu zastępczego bindingProperties, ponieważ istnieje wiele właściwości odczytu/zapisu, które można ustawić w rozszerzeniu znaczników. Właściwości można ustawić w dowolnej kolejności, z parami propName=value rozdzielonymi przecinkami. Pamiętaj, że w wyrażeniu powiązania nie można stosować podziałów wierszy. Niektóre właściwości wymagają typów, które nie mają konwersji typów, więc wymagają własnych rozszerzeń znaczników zagnieżdżonych w ramach {x:Bind}.

Te właściwości działają w taki sam sposób, jak właściwości klasy Binding .

Majątek Description
Path Zobacz sekcję Ścieżka właściwości powyżej.
Konwerter Określa obiekt konwertera, który jest wywoływany przez silnik wiązania. Konwerter można ustawić w języku XAML, ale tylko wtedy, gdy odwołujesz się do wystąpienia obiektu przypisanego w odwołaniu rozszerzenia znaczników {StaticResource} do tego obiektu w słowniku zasobów.
ConverterLanguage Określa kulturę, która ma być używana przez konwerter. (Jesli ustawiasz ConverterLanguage, powinieneś również ustawić konwerter.) Kultura jest ustawiana jako identyfikator oparty na standardach. Aby uzyskać więcej informacji, zobacz ConverterLanguage.
Parametr konwertera Określa parametr konwertera, który może być używany w logice konwertera. (Jeśli ustawiasz parametr ConverterParameter , należy również ustawić Konwerter). Większość konwerterów używa prostej logiki, która pobiera wszystkie potrzebne informacje z przekazanej wartości do konwersji i nie potrzebuje wartości ConverterParameter . Parametr ConverterParameter jest przeznaczony dla średnio zaawansowanych implementacji konwertera, które mają więcej niż jedną logikę, która wyłącza to, co jest przekazywane w ConverterParameter. Możesz napisać konwerter, który używa wartości innych niż ciągi, ale jest to nietypowe, zobacz Uwagi w ConverterParameter , aby uzyskać więcej informacji.
FallbackValue Określa wartość do wyświetlenia, gdy nie można rozpoznać źródła lub ścieżki.
Tryb Określa tryb powiązania w postaci jednego z następujących ciągów znaków: "OneTime", "OneWay" lub "TwoWay". Wartość domyślna to "OneTime". Należy pamiętać, że różni się to od wartości domyślnej dla elementu {Binding}, czyli "OneWay" w większości przypadków.
TargetNullValue Określa wartość do wyświetlenia, gdy wartość źródłowa jest rozpoznawana, ale jawnie ma wartość null.
BindBack Określa funkcję, która ma być używana dla odwrotnego kierunku powiązania dwukierunkowego.
UpdateSourceTrigger Określa, kiedy należy przesłać zmiany z kontrolki do modelu w powiązaniach dwukierunkowych (TwoWay). Wartość domyślna dla wszystkich właściwości, z wyjątkiem właściwości TextBox.Text, to PropertyChanged; dla TextBox.Text to LostFocus.

Uwaga / Notatka

Jeśli konwertujesz znaczniki z {Binding} na {x:Bind}, pamiętaj o różnicach w wartościach domyślnych właściwości Mode . x:DefaultBindMode może służyć do zmiany trybu domyślnego x:Bind dla określonego segmentu drzewa znaczników. Wybrany tryb będzie stosować dowolne wyrażenia x:Bind dla tego elementu i jego elementów podrzędnych, które nie określają jawnie trybu w ramach powiązania. Funkcja OneTime jest bardziej wydajna niż OneWay, ponieważ użycie usługi OneWay spowoduje wygenerowanie większej liczby kodu w celu podłączenia i obsługi wykrywania zmian.

Uwagi

Ponieważ program {x:Bind} używa wygenerowanego kodu w celu osiągnięcia korzyści, wymaga informacji o typie w czasie kompilacji. Oznacza to, że nie można wiązać się z właściwościami, których typu nie zna się na wcześniejszym etapie. W związku z tym nie można użyć właściwości {x:Bind} z właściwością DataContext , która jest typu Object, a także może ulec zmianie w czasie wykonywania.

W przypadku używania elementu {x:Bind} z szablonami danych należy wskazać typ powiązany przez ustawienie wartości x:DataType , jak pokazano w sekcji Przykłady . Można również ustawić typ na interfejs lub typ klasy bazowej, a następnie użyć rzutów, jeśli jest to konieczne, aby sformułować pełne wyrażenie.

Skompilowane powiązania zależą od generowania kodu. Jeśli używasz {x:Bind} w słowniku zasobów, to słownik musi mieć klasę zaplecza kodu. Zobacz Słowniki zasobów z {x:Bind} , aby zapoznać się z przykładem kodu.

Strony i kontrolki użytkownika, które zawierają skompilowane powiązania, będą miały właściwość "Powiązania" w wygenerowanym kodzie. Obejmuje to następujące metody:

  • Update() — spowoduje to zaktualizowanie wartości wszystkich skompilowanych powiązań. Wszystkie powiązania jednokierunkowe/dwukierunkowe będą miały podłączone nasłuchiwacze do wykrywania zmian.
  • Initialize() — jeśli powiązania nie zostały jeszcze zainicjowane, wywoła metodę Update(), aby zainicjować powiązania
  • StopTracking() — spowoduje to odłączenie wszystkich odbiorników utworzonych dla powiązań jednokierunkowych i dwukierunkowych. Można je ponownie zainicjować przy użyciu metody Update().

Uwaga / Notatka

Począwszy od systemu Windows 10 w wersji 1607, platforma XAML udostępnia wbudowany konwerter Boolean na Widoczność. Konwerter mapuje true na Visible i false na Collapsed, aby można było powiązać właściwość Widoczność z wartością Boolean bez tworzenia konwertera. Należy pamiętać, że nie jest to funkcjonalność powiązania funkcji, tylko powiązanie właściwości. Aby użyć wbudowanego konwertera, minimalna wersja docelowego zestawu SDK aplikacji musi być 14393 lub nowsza. Nie można jej używać, gdy aplikacja jest przeznaczona dla starszych wersji systemu Windows 10. Aby uzyskać więcej informacji na temat wersji docelowych, zobacz Wersja kodu adaptacyjnego.

Wskazówka

Jeśli musisz określić pojedynczy nawias klamrowy dla wartości, takiej jak Ścieżka lub KonwerterParameter, poprzedzić go ukośnikiem odwrotnym: \{. Alternatywnie, należy ująć cały ciąg zawierający nawiasy klamrowe, które należy zescapować, w dodatkowym zestawie cudzysłowów, na przykład ConverterParameter='{Mix}'.

Konwerter, ConverterLanguage i ConverterLanguage są związane ze scenariuszem konwertowania wartości lub typu ze źródła powiązania na typ lub wartość zgodną z właściwością docelową powiązania. Aby uzyskać więcej informacji i przykładów, zobacz sekcję "Konwersje danych" w sekcji Powiązanie danych w głębi systemu.

{x:Bind} jest tylko rozszerzeniem znaczników, bez możliwości programowego tworzenia lub manipulowania takimi powiązaniami. Aby uzyskać więcej informacji na temat rozszerzeń znaczników, zobacz Omówienie języka XAML.