Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Vývojáři obvykle deklarují vazby přímo v kódu XAML prvků uživatelského rozhraní, ke kterým chtějí svázat data. Můžete však také deklarovat vazby v kódu. Tento článek popisuje, jak deklarovat vazby v XAML i v kódu.
Požadavky
Než si přečtete tento článek, je důležité, abyste se seznámili s konceptem a používáním rozšíření značek. Další informace o rozšířeních značek naleznete v tématu Rozšíření značek a WPF XAML.
Tento článek se nezabývá koncepty datových vazeb. Diskuzi o konceptech datových vazeb najdete v přehledu datových vazeb.
Deklarace vazby v XAML
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 páry Name=Value, kde Name je název Binding vlastnosti 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=Name}"/>
Předchozí příklad používá jednoduchý datový typ objektu Person. Následující fragment kódu je kód pro tento objekt:
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
Většinu vlastností třídy Binding můžete zadat tímto způsobem. Další informace o rozšíření vazby a seznam Binding vlastností, které nelze nastavit pomocí rozšíření vazby, naleznete v přehledu Rozšíření značek vazby (.NET Framework).
Příklad vytvoření vazby v jazyce XAML najdete v tématu Postup vytvoření datové 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í rozšíření značek nebo syntaxe elementu objektu. Pokud však rozšíření značek nepodporuje váš scénář, například když je hodnota vlastnosti typu neřetězcový, pro který neexistuje žádný převod typu, musíte použít syntaxi elementu objektu.
Předchozí část ukazuje, jak vytvořit vazbu s rozšířením XAML. Následující příklad ukazuje stejnou vazbu, ale používá syntaxi elementu object:
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
Další informace o různých termínech najdete v tématu Podrobné informace o syntaxi XAML (.NET Framework).
MultiBinding a PriorityBinding
MultiBinding a PriorityBinding nepodporuje syntaxi rozšíření XAML. Proto je nutné použít syntaxi elementu objektu, pokud deklarujete MultiBinding nebo v PriorityBinding jazyce XAML.
Vytvoření vazby v kódu
Dalším způsobem, jak určit vazbu, je nastavit vlastnosti přímo u objektu Binding v kódu a pak přiřadit vazbu k vlastnosti. Následující příklad ukazuje, jak vytvořit Binding objekt v kódu.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Make a new data source object
var personDetails = new Person()
{
Name = "John",
Birthdate = DateTime.Parse("2001-02-03")
};
// New binding object using the path of 'Name' for whatever source object is used
var nameBindingObject = new Binding("Name");
// Configure the binding
nameBindingObject.Mode = BindingMode.OneWay;
nameBindingObject.Source = personDetails;
nameBindingObject.Converter = NameConverter.Instance;
nameBindingObject.ConverterCulture = new CultureInfo("en-US");
// Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject);
}
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
' Make a new data source object
Dim personDetails As New Person() With {
.Name = "John",
.Birthdate = Date.Parse("2001-02-03")
}
' New binding object using the path of 'Name' for whatever source object is used
Dim nameBindingObject As New Binding("Name")
' Configure the binding
nameBindingObject.Mode = BindingMode.OneWay
nameBindingObject.Source = personDetails
nameBindingObject.Converter = NameConverter.Instance
nameBindingObject.ConverterCulture = New CultureInfo("en-US")
' Set the binding to a target object. The TextBlock.Name property on the NameBlock UI element
BindingOperations.SetBinding(NameBlock, TextBlock.TextProperty, nameBindingObject)
End Sub
Předchozí kód nastavil na vazbu následující:
- Cesta vlastnosti objektu zdroje dat.
- Režim vazby.
- V tomto případě je zdrojem dat jednoduchá instance objektu představující osobu.
- Volitelný převaděč, který zpracovává hodnotu přicházející z objektu zdroje dat předtím, než je přiřazena k cílové vlastnosti.
Pokud je objekt, který používáte vazbu, FrameworkElement nebo FrameworkContentElementobjekt , můžete metodu SetBinding na objektu volat přímo namísto použití BindingOperations.SetBinding. Příklad najdete v tématu Postupy: Vytvoření vazby v kódu.
Předchozí příklad používá jednoduchý datový typ objektu Person. Následuje kód pro tento objekt:
class Person
{
public string Name { get; set; }
public DateTime Birthdate { get; set; }
}
Public Class Person
Public Property Name As String
Public Property Birthdate As DateTime
End Class
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.Ordernastaví vazbu na subpropertyOrderobjektu 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říkladPath="[(sys:Int32)42,(sys:Int32)24]", kdesysje mapován na obor názvůSystem.Pokud je zdrojem zobrazení kolekce, lze aktuální položku zadat lomítkem (
/). Klauzule napříkladPath=/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/ManagerNameurč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 tečky (
.) k vytvoření vazby k aktuálnímu zdroji. NapříkladText="{Binding}"je ekvivalentní sText="{Binding Path=.}".
Mechanismus pro zapouzdření
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.
Slouží
&k řídicímu znaku "&".Pomocí
>escapujte koncovou značku ">".
Kromě toho, pokud popisujete celou vazbu v atributu pomocí syntaxe rozšíření značek, musíte řídicí znaky (pomocí zpětného lomítka
\), které jsou speciální pro analyzátor rozšíření značek WPF:Zpětné lomítko (
\) je samotný řídicí 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ček.
Směr vazby
Binding.Mode Pomocí vlastnosti zadejte směr vazby. Pro aktualizace vazeb jsou k dispozici následující režimy:
| Režim vazby | Popis |
|---|---|
| BindingMode.TwoWay | Aktualizuje cílovou vlastnost nebo vlastnost vždy, když se změní cílová vlastnost nebo zdrojová vlastnost. |
| BindingMode.OneWay | Aktualizuje cílovou vlastnost pouze v případech, kdy se změní zdrojová vlastnost. |
| BindingMode.OneTime | Aktualizuje cílovou vlastnost pouze při spuštění aplikace nebo při DataContext změně. |
| BindingMode.OneWayToSource | Aktualizuje zdroj vlastnost při změně cílové vlastnosti. |
| BindingMode.Default | Způsobí, že se použije výchozí Mode hodnota cílové vlastnosti. |
Další informace najdete ve výčtu BindingMode.
Následující příklad ukazuje, jak nastavit Mode vlastnost:
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
Chcete-li zjistit změny zdroje (použitelné pro OneWay a vazby TwoWay), musí zdroj implementovat vhodný mechanismus oznámení o změně vlastnosti, jako je INotifyPropertyChanged. Další informace najdete v tématu Poskytování oznámení o změnách.
U vazeb TwoWay nebo OneWayToSource můžete řídit časování aktualizací zdroje nastavením vlastnosti UpdateSourceTrigger. Další informace najdete v tématu UpdateSourceTrigger.
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
Languagevlastnost objektu binding target. V JAZYCE XAML se tato výchozí hodnotaen-USnastaví nebo zdědí hodnotu z kořenového elementu (nebo jakéhokoli prvku) stránky, pokud byla explicitně nastavena.Pokud již vazba obsahuje kontext dat (například zděděný kontext dat pocházející z nadřazeného prvku) a jakákoli položka nebo kolekce vrácená 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, kde vazba působí na kolekci. Další informace naleznete v tématu Použití celých objektů jako zdroje 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, například TextBox.Text a RangeBase.Value, výchozí pro obousměrné vazby, ale většina ostatních vlastností má 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
- Přehled zdrojů vazby
- Vytvoření datové vazby
- Syntaxe XAML pro PropertyPath (.NET Framework)
.NET Desktop feedback