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 subpropertyOrder
objektu nebo vlastnostiShoppingCart
.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říkladPath=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]"
, kdesys
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 vlastnostOffices
, která je také kolekcí. Jeho aktuální položka je objekt, který obsahuje vlastnostManagerName
.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
&
k uniku znaku "&".Pomocí
>
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é
- Přehled datových vazeb
- Praktické návody
- Datové vazby
- syntaxe XAML
PropertyPath
.NET Desktop feedback