Mik azok a kötelező deklarációk?

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.Order záradék például a kötést az objektum vagy tulajdonság Orderal-tulajdonságára ShoppingCart á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 Path záradékban; például Path=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 olyan Path="[(sys:Int32)42,(sys:Int32)24]", ahol a sys a System névtérre van leképezve.

  • Ha a forrás gyűjteménynézet, az aktuális elem perjellel (/) adható meg. Például a Path=/ 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/ManagerName például a forrásgyűjtemény aktuális elemét adja meg, amely egy Offices tulajdonságot tartalmaz, amely szintén gyűjtemény. Az aktuális elem egy ManagerName tulajdonságot tartalmazó objektum.

  • Ha szükséges, egy pont (.) elérési út használható az aktuális forráshoz való kötéshez. A Text="{Binding}" például egyenértékű a Text="{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 &amp;-t, hogy "&" karaktert escape-eljen.

    • A "&gt;" 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 Language tulajdonságát használja. Az XAML-ben ez alapértelmezés szerint en-US vagy ö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