Sdílet prostřednictvím


Přehled deklarací vazeb

Toto téma popisuje různé způsoby, jak můžete deklarovat vazbu.

Požadavky

Než si přečtete toto téma, je důležité znát koncept a použití značkovacích rozšíření. Další informace o rozšířeních značek naleznete v tématu Rozšíření značek a WPF XAML.

Toto téma se nezabývá koncepty datových vazeb. Informace o konceptech datových vazeb najdete v tématu Přehled datových vazeb.

Deklarování vazby v XAML

Tato část popisuje, jak deklarovat vazbu v JAZYCE XAML.

Použití značkovacího rozšíření

Binding je rozšíření pro značkování. Když použijete rozšíření vazby k deklarování vazby, sestává deklarace z řady klauzulí následujících za klíčovým slovem Binding a oddělených čárkami (,). Klauzule v deklaraci vazby mohou být v libovolném pořadí a existuje mnoho možných kombinací. Klauzule jsou Name=Value páry, kde Name je název vlastnosti Binding a Value je hodnota, kterou pro vlastnost nastavujete.

Při vytváření řetězců deklarací vazby v kódu musí být připojeny ke konkrétní vlastnosti závislosti cílového objektu. Následující příklad ukazuje, jak vytvořit vazbu pro vlastnost TextBox.Text pomocí rozšíření vazby, s určením vlastností Source a Path.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

Většinu vlastností třídy Binding můžete zadat tímto způsobem. Pro více informací o vazebním rozšíření a pro seznam vlastností Binding, které je nemožné nastavit pomocí vazebního rozšíření, nahlédněte do přehledu Rozšíření značek vazby .

Syntaxe elementu objektu

Syntaxe elementu objektu je alternativou k vytvoření deklarace vazby. Ve většině případů neexistuje žádná konkrétní výhoda použití značkového rozšíření nebo syntaxe objektového elementu. V případech, kdy rozšíření značek nepodporuje váš scénář, například pokud je hodnota vlastnosti typu neřetězcový, pro který neexistuje žádný převod typu, musíte použít syntaxi elementu objektu.

Následuje příklad syntaxe elementu objektu i použití rozšíření značek:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

Příklad vytvoří vazbu vlastnosti Foreground deklarováním této vazby pomocí syntaxe rozšíření. Deklarace vazby pro vlastnost Text používá syntaxi elementu objektu.

Další informace o různých termínech najdete v tématu Podrobnosti syntaxe XAML.

MultiBinding a PriorityBinding

MultiBinding a PriorityBinding nepodporují syntaxi rozšíření XAML. Proto je nutné použít syntaxi elementu objektu, pokud deklarujete MultiBinding nebo PriorityBinding v XAML.

Vytvoření vazby v kódu

Dalším způsobem, jak zadat vazbu, je nastavit vlastnosti přímo na Binding objektu v kódu. Následující příklad ukazuje, jak vytvořit Binding objekt a zadat vlastnosti v kódu. V tomto příkladu TheConverter je objekt, který implementuje rozhraní 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

Pokud je objekt, ke kterému vytváříte vazbu, FrameworkElement nebo FrameworkContentElement, můžete volat metodu SetBinding přímo na svém objektu místo použití BindingOperations.SetBinding. Příklad najdete v Vytvoření vazby v kódu.

Syntaxe cesty vazby

Vlastnost Path použijte k určení zdrojové hodnoty, ke které chcete vytvořit vazbu:

  • V nejjednodušším případě je hodnota vlastnosti Path název vlastnosti zdrojového objektu, který se má použít pro vazbu, například Path=PropertyName.

  • Podvlastnosti vlastnosti lze zadat syntaxí podobnou jako v jazyce C#. Klauzule například Path=ShoppingCart.Order nastaví vazbu na subproperty Order objektu nebo vlastnosti ShoppingCart.

  • Chcete-li vytvořit vazbu k připojené vlastnosti, umístěte závorky kolem připojené vlastnosti. Například pro vázání na připojenou vlastnost DockPanel.Dockje syntaxe Path=(DockPanel.Dock).

  • Indexátory vlastnosti lze zadat v hranatých závorkách za názvem vlastnosti, na kterou je indexátor aplikován. Klauzule Path=ShoppingCart[0] například nastaví vazbu na index, který odpovídá tomu, jak interní indexování vlastnosti zpracovává řetězec tvořený znakem "0". Podporují se také vnořené indexery.

  • Indexery a dílčí podmínky je možné kombinovat v klauzuli Path; například Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • Uvnitř indexerů můžete mít více parametrů indexeru oddělených čárkami (,). Typ každého parametru lze zadat pomocí závorek. Můžete mít například Path="[(sys:Int32)42,(sys:Int32)24]", kde sys je mapován na obor názvů System.

  • Pokud je zdrojem zobrazení kolekce, lze aktuální položku zadat lomítkem (/). Klauzule například Path=/ nastaví vazbu na aktuální položku v zobrazení. Pokud je zdrojem kolekce, tato syntaxe určuje aktuální položku výchozího zobrazení kolekce.

  • Kombinováním názvů a lomítek lze procházet vlastnosti, které jsou kolekcemi. Například Path=/Offices/ManagerName určuje aktuální položku zdrojové kolekce, která obsahuje vlastnost Offices, která je také kolekcí. Jeho aktuální položka je objekt, který obsahuje vlastnost ManagerName.

  • Volitelně lze použít cestu s tečkou (.) k vytvoření vazby k aktuálnímu zdroji. Například Text="{Binding}" je ekvivalentní Text="{Binding Path=.}".

Mechanismus úniku

  • Uvnitř indexerů ([ ]) znak stříšky (^) uvozuje další znak.

  • Pokud nastavíte Path v jazyce XAML, musíte také escapeovat (pomocí entit XML) určité speciální znaky, které jsou zvláštní pro definici jazyka XML.

    • Použijte &amp; k uniku znaku "&".

    • Pomocí &gt; escapujte koncovou značku ">".

  • Kromě toho pokud popisujete celou vazbu v atributu pomocí syntaxe rozšíření značek, musíte escapovat speciální znaky (pomocí zpětného lomítka \), které jsou určeny pro analyzátor rozšíření značek WPF:

    • Zpětné lomítko (\) je samotný únikový znak.

    • Symbol rovná se (=) odděluje název vlastnosti od hodnoty vlastnosti.

    • Čárka (,) odděluje vlastnosti.

    • Pravá složená závorka (}) je konec rozšíření značkovacího jazyka.

Výchozí chování

Výchozí chování je následující, pokud není zadáno v deklaraci.

  • Vytvoří se výchozí převaděč, který se pokusí provést převod typu mezi zdrojovou hodnotou vazby a cílovou hodnotou vazby. Pokud převod nelze provést, výchozí převaděč vrátí null.

  • Pokud nenastavíte ConverterCulture, modul vazeb použije Language vlastnost cílového objektu vazby. V XAML je ve výchozím stavu nastavena hodnota "en-US" nebo se hodnota zdědí z kořenového elementu (nebo jakéhokoli prvku) stránky, pokud byl explicitně nastaven.

  • Pokud už vazba obsahuje kontext dat (například zděděný kontext dat pocházející z nadřazeného elementu) a libovolnou položku nebo kolekci vrácenou tímto kontextem je vhodná pro vazbu bez nutnosti další úpravy cesty, deklarace vazby nemusí mít vůbec žádné klauzule: {Binding} To je často způsob, jakým je vazba určena pro styl dat, v případě, že vazba působí na kolekci. Další informace viz část "Celé objekty používané jako zdroj vazby" v Přehled zdrojů vazby.

  • Výchozí hodnota Mode se liší mezi jednosměrným a obousměrným režimem v závislosti na tom, která vlastnost závislosti je vázána. Režim vazby můžete vždy deklarovat explicitně, abyste měli jistotu, že vaše vazba má požadované chování. Obecně platí, že uživatelsky upravitelné vlastnosti ovládacího prvku, jako jsou TextBox.Text a RangeBase.Value, mají jako výchozí obousměrné vazby, zatímco většina ostatních vlastností má jako výchozí jednosměrné vazby.

  • Výchozí hodnota UpdateSourceTrigger se liší mezi PropertyChanged a LostFocus v závislosti na vázané vlastnosti závislosti. Výchozí hodnota většiny vlastností závislosti je PropertyChanged, zatímco vlastnost TextBox.Text má výchozí hodnotu LostFocus.

Viz také