Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A fejlesztők általában közvetlenül azoknak a felhasználói felületi elemeknek az XAML-jelölésében deklarálják a kötéseket, amelyekhez adatokat szeretnének kötni. A kötéseket azonban kódban is deklarálhatja. Ez a cikk bemutatja, hogyan deklarálhat kötéseket az XAML-ben és a kódban is.
Előfeltételek
A cikk elolvasása előtt fontos, hogy tisztában legyen a korrektúra-bővítmények fogalmával és használatával. További információ a korrektúrakiterjesztésekről: Korrektúra-bővítmények és WPF XAML.
Ez a cikk nem foglalkozik az adatkötési fogalmakkal. Az adatkötési fogalmak ismertetését az Adatkötés áttekintésecímű témakörben tekintheti meg.
Kötés deklarálása az XAML-ben
Binding egy korrektúrakiterjesztés. Ha a kötéskiterjesztéssel deklarál egy kötést, a deklaráció a Binding kulcsszót követő, vesszővel (,) elválasztott záradékokból áll. A kötési deklaráció záradékai bármilyen sorrendben lehetnek, és számos lehetséges kombináció létezik. A záradékok Név=Érték párok, ahol Név a Binding tulajdonság neve, Érték pedig a tulajdonsághoz beállított érték.
Ha kötési deklarációs sztringeket hoz létre a korrektúrában, azokat egy célobjektum adott függőségi tulajdonságához kell csatolni. Az alábbi példa bemutatja, hogyan kötheti össze a TextBox.Text tulajdonságot a kötésbővítmény használatával, megadva a Source és Path tulajdonságokat.
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>
Az előző példa a Personegyszerű adatobjektum-típusát használja. A következő kódrészlet az objektum kódja:
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
A Binding osztály legtöbb tulajdonságát így adhatja meg. A kötésbővítményről és a kötéskiterjesztéssel nem állítható Binding tulajdonságok listájáról a Kötési korrektúra bővítmény (.NET-keretrendszer) áttekintésében olvashat.
A kötések XAML-ben való létrehozására vonatkozó példa: Adatkötés létrehozása.
Objektumelem szintaxisa
Az objektumelem szintaxisa alternatíva a kötési deklaráció létrehozására. A legtöbb esetben nincs különösebb előnye a jelölőkiterjesztés vagy az objektumelem szintaxis használatának. Ha azonban a korrektúrakiterjesztés nem támogatja a forgatókönyvet, például ha a tulajdonság értéke nem sztring típusú, és nem létezik típusátalakítás, akkor az objektumelem szintaxisát kell használnia.
Az előző szakasz bemutatta, hogyan lehet XAML-kiterjesztéssel kötést létesíteni. Az alábbi példa ugyanazt a kötést mutatja be, de objektumelem-szintaxist használ:
<TextBlock>
<TextBlock.Text>
<Binding Source="{StaticResource myDataSource}" Path="Name"/>
</TextBlock.Text>
</TextBlock>
További információ a különböző kifejezésekről: XAML Szintaxis részletei (.NET-keretrendszer).
Többszörös kötés és Elsőbbségi kötés
MultiBinding és PriorityBinding nem támogatják az XAML-bővítmény szintaxisát. Ezért kell használnia az objektum elem szintaxisát, ha XAML-ben MultiBinding-t vagy PriorityBinding-et deklarálja.
Kötés létrehozása kódban
A kötések megadásának másik módja, ha a tulajdonságokat közvetlenül egy Binding objektumon állítja be a kódban, majd hozzárendeli a kötést egy tulajdonsághoz. Az alábbi példa bemutatja, hogyan hozhat létre Binding objektumot a kódban.
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
Az előző kód a következőt állítja be a kötésre:
- Az adatforrás-objektum tulajdonságának elérési útja.
- A kötés módja.
- Ebben az esetben az adatforrás egy egyszerű objektumpéldány, amely egy személyt képvisel.
- Választható konverter, amely feldolgozza az adatforrás-objektumból érkező értéket, mielőtt hozzá lett rendelve a céltulajdonsághoz.
Ha a kötés tárgyát kötő objektum egy FrameworkElement vagy egy FrameworkContentElement, a SetBindinghasználata helyett közvetlenül meghívhatja az objektum BindingOperations.SetBinding metódusát. Példa: Útmutató: Kötés létrehozása a Kódban.
Az előző példa a Personegyszerű adatobjektum-típusát használja. Az objektum kódja a következő:
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
Kötési útvonal szintaxisa
A Path tulajdonsággal adja meg a forrásértéket, amelyhez hozzá szeretne kötni:
A legegyszerűbb esetben a Path tulajdonság értéke a kötéshez használandó forrásobjektum tulajdonságának neve, például
Path=PropertyName.A tulajdonság altulajdonságait a C# függvényhez hasonló szintaxissal lehet megadni. A
Path=ShoppingCart.Orderzáradék például a kötést az objektum vagy tulajdonságOrderal-tulajdonságáraShoppingCartállítja be.A csatolt tulajdonsághoz való kötéshez zárójeleket helyezzen a csatolt tulajdonság köré. Például a csatolt DockPanel.Docktulajdonsághoz kötéskor a szintaxis:
Path=(DockPanel.Dock).Egy tulajdonság indexelői szögletes zárójelben adhatók meg az indexelőt alkalmazó tulajdonságnév után. Például a
Path=ShoppingCart[0]záradék beállítja a kötést ahhoz az indexhez, amely a tulajdonság belső indexelése során a "0" szó szerinti karakterláncot kezeli. A beágyazott indexek is támogatottak.Az indexelők és az altulajdonságok keverhetők egy
Pathzáradékban; példáulPath=ShoppingCart.ShippingInfo[MailingAddress,Street].Indexelőkben. Több indexelő paramétert is elválaszthat vesszővel (
,). Az egyes paraméterek típusa zárójelekkel adható meg. Például lehet olyanPath="[(sys:Int32)42,(sys:Int32)24]", ahol asysaSystemnévtérre van leképezve.Ha a forrás gyűjteménynézet, az aktuális elem perjellel (
/) adható meg. Például aPath=/záradék a nézetben az aktuális elemhez állítja be a kötést. Ha a forrás gyűjtemény, ez a szintaxis az alapértelmezett gyűjteménynézet aktuális elemét adja meg.A tulajdonságnevek és perjelek együttesen használhatók a gyűjteményként funkcionáló tulajdonságok bejárásához. A
Path=/Offices/ManagerNamepéldául a forrásgyűjtemény aktuális elemét adja meg, amely egyOfficestulajdonságot tartalmaz, amely szintén gyűjtemény. Az aktuális elem egyManagerNametulajdonságot tartalmazó objektum.Ha szükséges, egy pont (
.) elérési út használható az aktuális forráshoz való kötéshez. AText="{Binding}"például egyenértékű aText="{Binding Path=.}".
Menekülési mechanizmus
Az indexelőkben (
[ ]) a kalapos karakter (^) megszökik a következő karaktert.Ha XAML-ben állítja be a Path, bizonyos karaktereket is el kell escape-elnie, amelyek speciális jelentéssel bírnak az XML-nyelvdefinícióban (XML-entitások használatával).
Használd a
&-t, hogy "&" karaktert escape-eljen.A "
>" végcímkét>használatával elkerülheti.
Továbbá, ha egy attribútum teljes kötését a korrektúrakiterjesztés szintaxisával írja le, a WPF korrektúrakiterjesztés-elemzőre jellemző karaktereket (fordított perjel
\) kell feloldani:A fordított perjel (
\) maga az escape karakter.Az egyenlőségjel (
=) elválasztja a tulajdonság nevét a tulajdonságértéktől.A vessző (
,) elválasztja a tulajdonságokat.A jobb oldali kapcsos zárójel (
}) a jelölőkiterjesztés vége.
Kötés iránya
A kötés irányának megadásához használja a Binding.Mode tulajdonságot. A kötésfrissítések a következő módokon érhetők el:
| Kötési mód | Leírás |
|---|---|
| BindingMode.TwoWay | Frissíti a céltulajdonságot vagy a tulajdonságot, amikor a céltulajdonság vagy a forrástulajdonság megváltozik. |
| BindingMode.OneWay | A céltulajdonság csak akkor frissül, ha a forrástulajdonság megváltozik. |
| BindingMode.OneTime | A céltulajdonság csak akkor frissül, amikor az alkalmazás elindul, vagy amikor a DataContext megváltozik. |
| BindingMode.OneWayToSource | Frissíti a forrástulajdonságot, amikor a céltulajdonság megváltozik. |
| BindingMode.Default | A céltulajdonság alapértelmezett Mode értékének alkalmazását eredményezi. |
További információért tekintse meg a BindingMode felsorolást.
Az alábbi példa bemutatja, hogyan állíthatja be a Mode tulajdonságot:
<TextBlock Name="IncomeText" Text="{Binding Path=TotalIncome, Mode=OneTime}" />
A forrásváltozások észleléséhez (OneWay és TwoWay kötésekre alkalmazható) a forrásnak megfelelő tulajdonságváltozás-értesítési mechanizmust kell implementálnia, például INotifyPropertyChanged. A további információkért tekintse meg: Változásértesítések.
TwoWay vagy OneWayToSource kötések esetében a forrásfrissítések időzítését a UpdateSourceTrigger tulajdonság beállításával szabályozhatja. További információért lásd UpdateSourceTrigger.
Alapértelmezett viselkedések
Az alapértelmezett viselkedés a következő, ha nincs megadva a deklarációban:
Létrejön egy alapértelmezett konverter, amely típuskonvertálást kísérel meg végrehajtani a kötés forrásértéke és a kötés célértéke között. Ha az átalakítás nem végezhető el, az alapértelmezett átalakító
nullad vissza.Ha nem állítja be a ConverterCulture, a kötési motor a kötési célobjektum
Languagetulajdonságát használja. Az XAML-ben ez alapértelmezés szerinten-USvagy örökli az értéket a lap gyökérelemétől (vagy bármely elemétől), ha egy kifejezetten be van állítva.Ha a kötés már rendelkezik adatkörnyezettel (például egy szülőelemből származó öröklött adatkörnyezettel), és az adott környezet által visszaadott elemek vagy gyűjtemények megfelelőek a kötéshez anélkül, hogy további elérési utat kellene módosítaniuk, a kötési deklarációk egyáltalán nem tartalmazhatnak záradékokat:
{Binding}. A kötések gyakran így vannak megadva az adatformázáshoz, ahol a kötés egy gyűjteményre hat. További információ: Teljes objektumok használata kötésforrásként.Az alapértelmezett Mode változik, attól függően, hogy a kötött függőségi tulajdonság egyirányú vagy kétirányú. A kötési módot mindig explicit módon deklarálhatja, hogy a kötés a kívánt viselkedést biztosítsa. Általában a felhasználó által szerkeszthető vezérlőtulajdonságok, például TextBox.Text és RangeBase.Value, alapértelmezés szerint kétirányú kötések, de a legtöbb egyéb tulajdonság alapértelmezés szerint egyirányú kötések.
Az alapértelmezett UpdateSourceTrigger érték a kötött függőségi tulajdonságtól függően PropertyChanged és LostFocus között változik. A legtöbb függőségi tulajdonság alapértelmezett értéke PropertyChanged, míg a TextBox.Text tulajdonság alapértelmezett értéke LostFocus.
Lásd még
.NET Desktop feedback