Βασικά στοιχεία σύνδεσης δεδομένων στο WPF. Σύνδεση δεδομένων στη διεπαφή χρήστη. Χρήση προτύπων ιεραρχικών δεδομένων

  • Προγραμματισμός
  • Ένα από τα βασικά σημεία στην ανάπτυξη xamlΟι προσανατολισμένες εφαρμογές είναι να χρησιμοποιούν δεσμεύσεις ( Δεσίματα). Δεσμευτικός- Αυτό μεσολαβητής(ενδιάμεσος), με τη βοήθεια του οποίου οι τιμές των ιδιοτήτων συγχρονίζονται μεταξύ των σχετικών αντικειμένων.

    Αξίζει να σημειωθεί ότι δεν είναι προφανές, αλλά σημαντική απόχρωση: Αν και το δέσιμο παραπέμπει κατά κάποιο τρόπο στα αλληλεπιδρώντα αντικείμενα, δεν τα εμποδίζει να συλλέγονται σκουπίδια!

    Κληρονομιά από μια τάξη Δεσμευτικόςεπιτρέπεται, αλλά για λόγους ασφαλείας κώδικα που υπερισχύουν της μεθόδου ProvideValue, που σχετίζεται με την κύρια λογική λειτουργίας, δεν επιτρέπεται. Αυτό προκαλεί κατά κάποιο τρόπο τους προγραμματιστές να χρησιμοποιήσουν το μοτίβο Μετατροπέας, το οποίο είναι στενά συνυφασμένο με το θέμα των δεσίμων.

    Τα δεσίματα είναι ένα πολύ ισχυρό εργαλείο, αλλά σε ορισμένες περιπτώσεις η δήλωσή τους γίνεται περιεκτική και άβολη για τακτική χρήση, για παράδειγμα, για εντοπισμό. Σε αυτό το άρθρο θα δούμε μια απλή και κομψή μέθοδο που κάνει τον κώδικα πολύ πιο καθαρό και πιο όμορφο.


    Δηλώστε δεσμεύσεις σε xamlεπιτρέπεται με δύο τρόπους:



    Προφανώς, η πρώτη μέθοδος δεν φαίνεται πολύ συνοπτική, αλλά η δεύτερη, με βάση τη χρήση επεκτάσεις σήμανσης, χρησιμοποιείται πιο συχνά. Στην πλατφόρμα WPFυπάρχει η ευκαιρία να δημιουργήσουμε προσαρμοσμένες επεκτάσεις σήμανσης. Για παράδειγμα, είναι βολικά στη χρήση για εντοπισμό.


    Στην απλούστερη περίπτωση, πρέπει να κληρονομήσετε από την τάξη Επέκταση Markupκαι εφαρμόστε τη μέθοδο ProvideValue, στο οποίο μπορείτε να λάβετε την επιθυμητή τιμή χρησιμοποιώντας το κλειδί.

    Αλλά αυτή η υλοποίηση δεν υποστηρίζει καυτή βάρδιαγλώσσα κατά την εκτέλεση του προγράμματος. Για να γίνει αυτή η βελτίωση, είναι απαραίτητο, πρώτον, να αποθηκευτεί μια αναφορά στο τοπικό στοιχείο διεπαφής και, δεύτερον, που είναι λιγότερο προφανές, να υπάρχει με κάποιο τρόπο στην εφαρμογή μια αναφορά στην ίδια την παρουσία κλάσης Εντοπισμός, για την προστασία του από τη συλλογή σκουπιδιών και, τρίτον, απαιτείται η σωστή εφαρμογή της εγγραφής και της απεγγραφής από το συμβάν αλλαγής γλώσσας.

    Εάν κάνετε αυτά τα πράγματα λάθος, είναι εγγυημένο ότι θα έχετε διαρροές μνήμης εάν οι προβολές δημιουργηθούν και καταστραφούν δυναμικά ενώ εκτελείται η εφαρμογή, κάτι που συμβαίνει σε πολλές περιπτώσεις. Δηλαδή, προσθέτοντας ότι δεν φαίνεται το πιο πολύ σύνθετη λειτουργία, θα πρέπει να ασχοληθείτε με μη τετριμμένα θέματα αδύναμους κρίκουςΚαι αδύναμες συνδρομές εκδηλώσεων. Και ο κώδικας δεν θα είναι πολύ απλός.

    Επιπλέον, στις xaml-πλατφόρμες Windows Phone, Windows Store Και Xamarin.Έντυπαδεν υπάρχει τρόπος δημιουργίας προσαρμοσμένων επεκτάσεων σήμανσης, που αναδεικνύει την ιδέα της χρήσης δεσμεύσεων ως επεκτάσεις σήμανσης

    Ας μην χτυπάμε γύρω από τον θάμνο, ορίστε τι χρειαζόμαστε:

    Δημόσια αφηρημένη κλάση BindingExtension: Binding, IValueConverter ( προστατευμένη BindingExtension() ( Source = Converter = this; ) προστατευμένη BindingExtension(πηγή αντικειμένου) // ορίστε την Source σε null για χρήση DataContext ( Source = source; Converter = this; ) protected BindingSextension(Relative relativeSource) ( RelativeSource = relativeSource; Converter = this; ) δημόσιο αφηρημένο αντικείμενο Μετατροπή (τιμή αντικειμένου, Τύπος targetType, παράμετρος αντικειμένου, πολιτισμός CultureInfo δημόσιου εικονικού αντικειμένου ConvertBack (τιμή αντικειμένου, Τύπος targetType, παράμετρος αντικειμένου, πολιτισμός CultureInfo) NotImplementedException();
    Αξίζει να σημειωθεί ότι το δέσιμο είναι ένας μετατροπέας για τον εαυτό του. Ως αποτέλεσμα, έχουμε συμπεριφορά παρόμοια με αυτήν της κληρονομιάς από μια τάξη Επέκταση Markup, αλλά, επιπλέον, Παραμένει δυνατή η χρήση τυπικών μηχανισμών ελέγχου αποκομιδής απορριμμάτων!

    Τώρα η λογική για την εμφάνιση τοπικής προσαρμογής δεν θα μπορούσε να είναι πιο απλή:

    Δημόσια μερική κλάση Localizing: Base.BindingExtension ( δημόσια στατική μόνο για ανάγνωση Manager ActiveManager = new Manager(); public Localizing() ( Source = ActiveManager; Path = new PropertyPath("Source"); ) public Localizing(κλειδί συμβολοσειράς) ( Key = key Πηγή = ActiveManager = new PropertyPath("Πηγή" δημόσιας συμβολοσειράς ( get; set; ) Convert(τιμή αντικειμένου, Τύπος targetType, παράμετρος αντικειμένου, CultureInfo Culture) (κλειδί var = Κλειδί). τιμή ως ResourceManager; var localizedValue = resourceManager == null || επιστροφή localizedValue.
    δημόσια μερική κλάση Localizing ( Public class Manager: INotifyPropertyChanged ( private ResourceManager _source; public ResourceManager Source ( get ( return _source; ) set ( _source = value; PropertyChanged(this, new PropertyChangedEventArgs("Source")); ) ) δημόσια συμβολοσειρά Get( κλειδί συμβολοσειράς, συμβολοσειρά stringFormat = null) ( if (_source == null || string.IsNullOrWhiteSpace(key)) κλειδί επιστροφής; var localizedValue = _source.GetString(key) ?? ":" + κλειδί + ":"; συμβολοσειρά επιστροφής .IsNullOrEmpty(stringFormat) ;
    Είναι εύκολο να προσθέσετε τη δυνατότητα αλλαγής πεζών-κεφαλαίων γραμμάτων:

    Δημόσια μερική κλάση Localizing: Base.BindingExtension ( δημόσιος αριθμός Περιπτώσεις ( Προεπιλογή, Κάτω, Άνω ) δημόσια στατική μόνο για ανάγνωση Manager ActiveManager = new Manager(); public Localizing() ( Source = ActiveManager; Path = new PropertyPath("Source"); ) δημόσιος εντοπισμός(κλειδί συμβολοσειράς) (Κλειδί = κλειδί; Πηγή = ActiveManager; Διαδρομή = νέο PropertyPath("Πηγή"); ) δημόσια συμβολοσειρά Κλειδί ( get; set; ) δημόσια περίπτωση Υπόθεση ( get; set; ) δημόσια συμβολοσειρά παράκαμψης ToString() ( επιστρέφει το Convert(ActiveManager.Source, null, Key, Thread.CurrentThread.CurrentCulture) ως συμβολοσειρά ?? string.Empty; ) δημόσια παράκαμψη αντικειμένου Convert(τιμή αντικειμένου, Τύπος targetType, παράμετρος αντικειμένου, πολιτισμός CultureInfo) ( κλειδί var = Κλειδί; var resourceManager = τιμή ως ResourceManager; var localizedValue = resourceManager == null || "); switch (Case) ( case Cases.Lower: return localizedValue.ToLower(); case Cases.Upper: return localizedValue.ToUpper(); προεπιλογή: επιστροφή localizedValue. ) ))
    ΣΕ xamlΗ εγγραφή φαίνεται βολική και όμορφη, αλλά υπάρχουν ορισμένοι περιορισμοί των αναλυτών σήμανσης σε διάφορες πλατφόρμες:


    Να ξεφορτωθώ WPFαπό το απαιτούμενο πρόθεμα Μ:πρέπει να τοποθετήσετε την επέκταση σήμανσης σε ξεχωριστή διάταξη και μέσα Ιδιότητες/AssemblyInfo.csκαθορίζει τις ακόλουθες οδηγίες:


    Για να προσαρμόσετε το όνομα του προθέματος σε Windows Phoneή Κατάστημα:


    Χρήση επεκτάσεων σύνδεσης ( Βασικές επεκτάσεις) επί WPFδεν αποκλείει τις κανονικές επεκτάσεις σήμανσης, αλλά σε ορισμένες περιπτώσεις είναι ακόμη πιο ασφαλής και απλή επιλογή. Επίσης, όλα αυτά δεν περιορίζονται μόνο στον εντοπισμό, αλλά είναι κατάλληλα για πολλούς άλλους σκοπούς...

    Η αποδεδειγμένη προσέγγιση χρησιμοποιείται εκτενώς στη βιβλιοθήκη

    Τελευταία ενημέρωση: 02/07/2016

    Στο WPF, το δεσμευτικό είναι ισχυρό εργαλείοπρογραμματισμού, χωρίς τον οποίο δεν μπορεί να κάνει καμία σοβαρή εφαρμογή.

    Η σύνδεση περιλαμβάνει την αλληλεπίδραση δύο αντικειμένων: μιας πηγής και ενός προορισμού. Το αντικείμενο προορισμού δημιουργεί μια σύνδεση σε μια συγκεκριμένη ιδιότητα του αντικειμένου προέλευσης. Εάν τροποποιηθεί το αντικείμενο προέλευσης, θα τροποποιηθεί και το αντικείμενο προορισμού. Για παράδειγμα, απλούστερη μορφήχρησιμοποιώντας δέσιμο:

    Για να ορίσετε μια σύνδεση, μια έκφραση όπως:

    (Binding ElementName=Source object_name, Path=Source object_property)

    Δηλαδή, σε αυτήν την περίπτωση, το στοιχείο TextBox είναι η πηγή και το TextBlock είναι ο προορισμός της σύνδεσης. Ιδιοκτησία Κείμενο στοιχείουΤο TextBlock είναι δεσμευμένο στην ιδιότητα Text του TextBox. Ως αποτέλεσμα, όταν εισέρχεστε σε ένα πεδίο κειμένου, οι αλλαγές στο μπλοκ κειμένου θα πραγματοποιούνται συγχρονισμένα.

    Εργασία με Binding σε C#

    Το βασικό αντικείμενο κατά τη δημιουργία ενός δεσμευτικού είναι το αντικείμενο System.Windows.Data.Binding. Χρησιμοποιώντας αυτό το αντικείμενο μπορούμε να πάρουμε την ήδη υπάρχουσα σύνδεση για το στοιχείο:

    Binding binding = BindingOperations.GetBinding(myTextBlock, TextBlock.TextProperty);

    Σε αυτήν την περίπτωση, λαμβάνουμε μια σύνδεση για την ιδιότητα εξάρτησης TextProperty του στοιχείου myTextBlock.

    Μπορείτε επίσης να ορίσετε τη σύνδεση εξ ολοκλήρου σε κώδικα C#:

    Public MainWindow() ( InitializeComponent(); Binding binding = new Binding(); binding.ElementName = "myTextBox"; // στοιχείο πηγής binding.Path = new PropertyPath("Text"); // ιδιότητα στοιχείου πηγής myTextBlock. SetBinding( TextBlock.TextProperty, binding // ρύθμιση της σύνδεσης για το στοιχείο δέκτη)

    Εάν στο μέλλον δεν χρειαζόμαστε πλέον δέσμευση, μπορούμε να χρησιμοποιήσουμε την κλάση BindingOperations και τις μεθόδους της ClearBinding() (αφαιρεί ένα binding) και ClearAllBindings() (αφαιρεί όλες τις δεσμεύσεις για ένα δεδομένο στοιχείο).

    BindingOperations.ClearBinding(myTextBlock, TextBlock.TextProperty);

    BindingOperations.ClearAllBindings(myTextBlock);

    Μερικές ιδιότητες της κλάσης Binding:

      ElementName : το όνομα του στοιχείου στο οποίο δημιουργείται η δέσμευση

      IsAsync: Εάν οριστεί σε True, χρησιμοποιεί ασύγχρονη λειτουργία για τη λήψη δεδομένων από το αντικείμενο. Προεπιλογές σε False

      Λειτουργία: Λειτουργία δέσμευσης

      TargetNullValue : Ορίζει την προεπιλεγμένη τιμή εάν έχει η δεσμευμένη ιδιότητα της πηγής δέσμευσης μηδενική τιμή

      RelativeSource: Δημιουργεί μια σύνδεση σε σχέση με το τρέχον αντικείμενο

      Πηγή: Υποδεικνύει το αντικείμενο προέλευσης εάν δεν είναι στοιχείο ελέγχου.

      XPath : χρησιμοποιείται αντί για την ιδιότητα διαδρομής για τον καθορισμό της διαδρομής προς τα δεδομένα xml

    Λειτουργίες Snap

    Η ιδιότητα Mode ενός αντικειμένου Binding, που αντιπροσωπεύει τη λειτουργία δέσμευσης, μπορεί να λάβει τις ακόλουθες τιμές:

      OneWay: Η ιδιότητα του αντικειμένου προορισμού αλλάζει μετά την τροποποίηση της ιδιότητας του αντικειμένου προέλευσης.

      OneTime: Η ιδιότητα του αντικειμένου προορισμού ορίζεται στην ιδιότητα του αντικειμένου προέλευσης μόνο μία φορά. Μεταγενέστερες αλλαγές στην πηγή δεν έχουν καμία επίδραση στο αντικείμενο προορισμού.

      TwoWay: Τόσο τα αντικείμενα εφαρμογής όσο και τα αντικείμενα πηγής μπορούν να αλλάξουν το ένα τις δεσμευμένες ιδιότητες του άλλου.

      OneWayToSource: Το αντικείμενο προορισμού στο οποίο δηλώνεται η σύνδεση αλλάζει το αντικείμενο προέλευσης.

      Προεπιλογή : από προεπιλογή (αν αλλάξει η ιδιότητα TextBox.Text, έχει την τιμή TwoWay, διαφορετικά OneWay).

    Εφαρμογή της λειτουργίας snap:

    Δεσμευτική ενημέρωση. UpdateSourceTrigger

    Η μονόδρομη σύνδεση από πηγή σε δέκτη αλλάζει την ιδιότητα του δέκτη σχεδόν αμέσως. Αλλά αν χρησιμοποιήσουμε αμφίδρομη σύνδεση στην περίπτωση πεδίων κειμένου (όπως στο παραπάνω παράδειγμα), τότε όταν αλλάζει ο προορισμός, η ιδιότητα προέλευσης δεν αλλάζει αμέσως. Έτσι, στο παραπάνω παράδειγμα, για να αλλάξει το πεδίο κειμένου προέλευσης, πρέπει να αλλάξουμε την εστίαση από πεδίο κειμένου-δέκτης Και σε αυτήν την περίπτωση, εμφανίζεται η ιδιότητα UpdateSourceTrigger της κλάσης Binding, η οποία καθορίζει πώς θα γίνει η ενημέρωση. Αυτή η ιδιότητα λαμβάνει μία από τις τιμές απαρίθμησης UpdateSourceTrigger:

      PropertyChanged: Η πηγή σύνδεσης ενημερώνεται αμέσως μετά την ενημέρωση της ιδιότητας στο νεροχύτη

      LostFocus: Η πηγή αγκύρωσης ενημερώνεται μόνο αφού ο δέκτης χάσει την εστίαση

      Ρητό: Η πηγή δεν ενημερώνεται μέχρι να κληθεί η μέθοδος BindingExpression.UpdateSource()

      Προεπιλογή: Προεπιλεγμένη τιμή. Για τις περισσότερες ιδιότητες, αυτό είναι το PropertyChanged . Και για την ιδιότητα Text του στοιχείου TextBox, αυτή η τιμή είναι LostFocus

    Σε αυτήν την περίπτωση μιλάμε γιασχετικά με την ενημέρωση της πηγής δέσμευσης μετά την αλλαγή του προορισμού σε λειτουργίες OneWayToSource ή TwoWay. Δηλαδή, ώστε και τα δύο πεδία κειμένου που συνδέονται με τη λειτουργία TwoWay να ενημερώνονται αμέσως μετά την αλλαγή ενός από αυτά, πρέπει να χρησιμοποιήσουμε την τιμή UpdateSourceTrigger.PropertyChanged:

    Ιδιότητα πηγής

    Η ιδιότητα Source σάς επιτρέπει να ορίσετε μια σύνδεση ακόμη και σε αντικείμενα που δεν είναι στοιχεία ελέγχου WPF. Για παράδειγμα, ας ορίσουμε την κλάση Phone:

    Τηλέφωνο τάξης ( δημόσια συμβολοσειρά Τίτλος ( get; set; ) public string Company ( get; set; ) public int Τιμή ( get; set; ) )

    Τώρα ας δημιουργήσουμε ένα αντικείμενο αυτής της κλάσης και ας ορίσουμε μια σύνδεση σε αυτό:

    Ιδιότητα TargetNullValue

    Σε περίπτωση που μια ιδιότητα στην πηγή δέσμευσης έχει ξαφνικά την τιμή null, δηλαδή δεν έχει οριστεί, μπορούμε να ορίσουμε κάποια προεπιλεγμένη τιμή. Για παράδειγμα:

    Σε αυτήν την περίπτωση, ο πόρος nexusPhone δεν έχει σύνολο ιδιοτήτων Title, επομένως το μπλοκ κειμένου θα εξάγει την προεπιλεγμένη τιμή που καθορίζεται στην παράμετρο TargetNullValue.

    Ιδιότητα RelativeSource

    Η ιδιότητα RelativeSource σάς επιτρέπει να ορίσετε μια σύνδεση σε σχέση με ένα στοιχείο προέλευσης που έχει κάποιο είδος σχέσης με το στοιχείο προορισμού. Για παράδειγμα, το στοιχείο προέλευσης μπορεί να είναι ένα από τα εξωτερικά δοχεία για το στοιχείο προορισμού. Ή η πηγή και ο προορισμός μπορεί να είναι το ίδιο στοιχείο.

    Για να ορίσετε αυτήν την ιδιότητα, χρησιμοποιήστε το αντικείμενο RelativeSource με το ίδιο όνομα. Αυτό το αντικείμενο έχει μια ιδιότητα Mode, η οποία καθορίζει τη μέθοδο σύνδεσης. Παίρνει μία από τις τιμές απαρίθμησης RelativeSourceMode:

      Self: η δέσμευση πραγματοποιείται σε μια ιδιότητα του ίδιου στοιχείου. Δηλαδή, το στοιχείο πηγής του δέσιμου είναι ταυτόχρονα και ο δέκτης του δέσιμου.

      FindAncestor: η σύνδεση πραγματοποιείται στην ιδιότητα του στοιχείου κοντέινερ.

    Για παράδειγμα, συνδυάστε τη σύνδεση προέλευσης και προορισμού στο ίδιο το στοιχείο:

    Εδώ το κείμενο και το χρώμα φόντου του πλαισίου κειμένου συνδέονται με αμφίδρομη σύνδεση. Ως αποτέλεσμα, μπορούμε να δούμε στο γήπεδο αριθμητική αξίαχρώμα, αλλάξτε το και το φόντο του πεδίου θα αλλάξει μαζί με αυτό.

    Δέσμευση στις ιδιότητες του δοχείου:

    Όταν χρησιμοποιείτε τη λειτουργία FindAncestor, δηλαδή τη σύνδεση σε ένα κοντέινερ, πρέπει επίσης να καθορίσετε την παράμετρο AncestorType και να της μεταβιβάσετε τον τύπο κοντέινερ με τη μορφή της έκφρασης AncestorType=(x:Type Container_element_type) . Σε αυτήν την περίπτωση, θα μπορούσαμε να επιλέξουμε οποιοδήποτε κοντέινερ στο δέντρο των στοιχείων ως κοντέινερ, σε αυτήν την περίπτωση, εκτός από το Πλέγμα, ένα τέτοιο δοχείο είναι επίσης το στοιχείο Παράθυρο.

    Ιδιότητα DataContext

    Το αντικείμενο FrameworkElement από το οποίο κληρονομούν τα στοιχεία ελέγχου έχει μια ενδιαφέρουσα ιδιότητα DataContext. Σας επιτρέπει να ορίσετε κάποιο πλαίσιο δεδομένων για ένα στοιχείο και τα ένθετα στοιχεία του. Ένθετα στοιχεία μπορούν στη συνέχεια να χρησιμοποιήσουν το αντικείμενο Binding για να συνδεθούν σε συγκεκριμένες ιδιότητες αυτού του περιβάλλοντος. Για παράδειγμα, ας χρησιμοποιήσουμε την κλάση Phone που ορίστηκε προηγουμένως και ας δημιουργήσουμε ένα περιβάλλον δεδομένων από ένα αντικείμενο αυτής της κλάσης:

    Με αυτόν τον τρόπο ορίζουμε την ιδιότητα DataContext σε κάποιον δυναμικό ή στατικό πόρο. Στη συνέχεια, δεσμευόμαστε σε αυτόν τον πόρο.

    Σχόλιο: ΣΕ αυτός ο τομέαςκαλύπτει τις βασικές έννοιες της δέσμευσης δεδομένων στο WPF. Ορισμένα παραδείγματα καταδεικνύουν τις βασικές πτυχές της σύνδεσης στοιχείων διεπαφής σε οπτικά και μη οπτικά αντικείμενα WPF. Πιο προηγμένα θέματα, όπως η δέσμευση στοιχείων διεπαφής WPF σε προσαρμοσμένα αντικείμενα και συλλογές πληκτρολογημένων δεδομένων, αντικείμενα πλαισίου ADO.NET και πρότυπα, θα καλυφθούν αργότερα.

    Μέρος Ι

    Γενικές προμήθειες

    Όλα τα προγράμματα που είναι απαραίτητα για την εκτέλεση αυτής της εργασίας βρίσκονται στον επισυναπτόμενο κατάλογο.

    Η σύνδεση δεδομένων είναι ένας μηχανισμός εξαγωγής πληροφοριών από αντικείμενα σε στοιχεία διεπαφής για εμφάνιση και αντίστροφα - ώθηση πληροφοριών από τα στοιχεία ελέγχου σε αντικείμενα. Η σύνδεση δεδομένων σάς επιτρέπει να κάνετε λίγη ή καθόλου κωδικοποίηση. Αυτή είναι μια σχετικά παλιά τεχνική, αλλά WPFέχει αναπτυχθεί περαιτέρω και έχει τις δικές του ιδιαιτερότητες. Όλη η πολυπλοκότητα της υποστήριξης βιβλιοδεσίας λαμβάνεται υπόψη από τις τάξεις της βιβλιοθήκης και τον χρόνο εκτέλεσης. Το Binding καλύπτει ένα ευρύ φάσμα εργασιών: από τη σύνδεση απλών στοιχείων διεπαφής μεταξύ τους έως τη σύνδεση μιας βάσης δεδομένων έως προσαρμοσμένες μορφές αλληλεπίδρασης με δεδομένα.

    Η δέσμευση δεδομένων περιλαμβάνει πάντα δύο μέρη: την πηγή και τον δέκτη (στοιχείο στόχο) των πληροφοριών. Η σύνδεση δεδομένων μπορεί να παρέχει μονοκατευθυντική ή αμφίδρομη επικοινωνία των σχετικών ιδιοτήτων αντικειμένου. Τις περισσότερες φορές χρησιμοποιείται μονόδρομη σύνδεση, σκοπός της οποίας είναι η εξαγωγή πληροφοριών από μια πηγή και η εμφάνισή τους σε έναν δέκτη. Αλλά σε ορισμένες περιπτώσεις, οι διαφορές μεταξύ της πηγής και του δέκτη διαγράφονται και μερικές φορές ακόμη και οι ρόλοι τους αντιστρέφονται - ο δέκτης αρχίζει να παρέχει δεδομένα στην πηγή.

    Η σύνταξη δέσμευσης δεδομένων, όπως στην περίπτωση των πόρων, έχει επίσης δύο επιλογές: επεκτάσεις σήμανσηςΚαι στοιχεία ιδιοκτησίας, αλλά διαφέρει στις λεπτομέρειες. Το βασικό στοιχείο της σύνδεσης για οποιαδήποτε επιλογή είναι ο ορισμός ενός αντικειμένου Binding από τον χώρο ονομάτων System.Windows.Data. Αυτό το στοιχείο τίθεται πάντα στην πλευρά του δέκτη της βιβλιοδεσίας, εκτός από το Mode=OneWayToSource . Ο δέκτης πρέπει να προέρχεται από την κλάση DependencyObject και η δεσμευτική ιδιότητα (ιδιότητα στόχος) πρέπει να είναι ιδιότητα εξάρτησης. Ενσωματωμένη σε ιδιότητες εξάρτησης είναι η δυνατότητα αποστολής ή λήψης ειδοποιήσεων αλλαγής.

    Υπάρχουν πολύ λιγότερες απαιτήσεις για την πηγή σύνδεσης. Η ιδιότητα πηγής που δεσμεύεται δεν χρειάζεται να είναι εξαρτημένη περιουσία. Το κύριο πράγμα είναι ότι η πηγή έχει ένα συμβάν ειδοποίησης που υποδεικνύει μια αλλαγή στη δεσμευμένη ιδιότητα. Η δεσμευτική πηγή μπορεί να είναι οποιαδήποτε δημόσια ιδιοκτησία, συμπεριλαμβανομένων ιδιοτήτων άλλων στοιχείων ελέγχου, αντικειμένων χρόνους εκτέλεσης κοινής γλώσσας, στοιχεία XAML, σύνολα δεδομένων ADO.NET, θραύσματα XML κ.λπ. Για να εφαρμόσετε σωστά το δέσιμο σε σύνθετα αντικείμεναΗ τεχνολογία δεδομένων WPF παρέχει δύο εξειδικευμένες κλάσεις - XmlDataProvider και ObjectDataProvider.

    Οι ιδιότητες εξάρτησης ονομάζονται επίσης προσαρτημένος. Σε έκδοση XAML, προορίζεται για WPF, οι συνημμένες ιδιότητες λειτουργούν μόνο εάν τόσο ο τύπος στον οποίο ορίζεται η ιδιότητα όσο και ο τύπος στον οποίο είναι συνδεδεμένη κληρονομούν την κλάση DependencyObject. Χρήση ιδιοτήτων εξάρτησης γλώσσας XAMLέχει τη δυνατότητα να επεκτείνει τύπους χρησιμοποιώντας ιδιότητες που παρέχονται από άλλους τύπους. Όταν χρησιμοποιείται στη σήμανση σύνταξης στοιχείου ιδιότητας, η συνημμένη ιδιότητα προηγείται πάντα από το όνομα του τύπου που την παρέχει, ακόμα κι αν η ιδιότητα χρησιμοποιείται ως χαρακτηριστικό.

    Λήψη οδηγιών

    Ο τύπος δέσμευσης ενός στοιχείου Binding καθορίζεται από την ιδιότητά του Mode, η οποία μπορεί να λάβει μία από τις τιμές απαρίθμησης BindingMode από τον χώρο ονομάτων System.Windows.Data:

    • Προκαθορισμένο- ορίζεται από προεπιλογή και εξαρτάται από τον τύπο της ιδιότητας που δεσμεύεται στην πλευρά του δέκτη (ιδιότητα στόχου). Λειτουργεί ως λειτουργία δέσμευσης δύο κατευθύνσεων για ιδιότητες που είναι επεξεργάσιμες στη διεπαφή χρήστη, όπως το TextBox.Text ή το CheckBox.Checked, ή ως λειτουργία δέσμευσης OneWay για άλλες ιδιότητες. Για να μην βασίζεστε στις προεπιλεγμένες ρυθμίσεις, θα πρέπει να ορίσετε πάντα ρητά την παράμετρο κατεύθυνσης κουμπώματος.
    • Μια φορά- μονόδρομη αρχική δέσμευση, όταν η τιμή της ιδιότητας προορισμού ορίζεται στην τιμή της πηγής μόνο μία φορά: κατά την προετοιμασία, αντικατάσταση λογισμικούδεσμευμένο αντικείμενο πηγής σε ένα νέο, όταν αλλάζει η ιδιότητα DataContext ή ως αποτέλεσμα μιας κλήσης μεθόδου προγραμματισμού BindingExpression.UpdateTarget(). Άλλες εισερχόμενες ειδοποιήσεις σχετικά με αλλαγές στην πλευρά της πηγής δεν θα λαμβάνονται υπόψη από τον παραλήπτη
    • OneWay- μονόδρομη σύνδεση, όπου η ιδιότητα προορισμού ενημερώνεται όταν αλλάζει η ιδιότητα προέλευσης. Κάθε φορά που υπάρχει μια αλλαγή στην πλευρά της πηγής, η ροή δεδομένων κατευθύνεται από την πηγή στον στόχο.
    • OneWayToSource- οργανώνει μια μονόδρομη σύνδεση, όπως το OneWay, μόνο η δεσμευτική έκφραση τοποθετείται στην πηγή. Αυτό το τέχνασμα μπορεί να είναι χρήσιμο όταν η ιδιότητα προορισμού που δεσμεύεται δεν είναι ιδιότητα εξάρτησης, αλλά η ιδιότητα προέλευσης εξακολουθεί να κληρονομείται από την κλάση DependencyObject.
    • Αμφίδρομη- αμφίδρομη σύνδεση, όπου η ιδιότητα προορισμού ενημερώνεται όταν αλλάζει η ιδιότητα προέλευσης και η ιδιότητα προέλευσης ενημερώνεται όταν αλλάζει η ιδιότητα προορισμού. Με άλλα λόγια, η λειτουργία δέσμευσης δύο κατευθύνσεων στέλνει δεδομένα από την πηγή στον στόχο και εάν αλλάξει η τιμή μιας ιδιότητας του στόχου, τα δεδομένα αποστέλλονται πίσω από τον στόχο στην πηγή

    Άσκηση 1: Δέσμευση στοιχείου σε στοιχείο

    Σε αυτήν την άσκηση, θα εξετάσουμε τη δημιουργία ενός καναλιού επικοινωνίας μεταξύ των ιδιοτήτων εξάρτησης των οπτικών στοιχείων WPF UI χρησιμοποιώντας διάφορα παραδείγματα.

    >

    Τώρα έχετε δημιουργήσει πλήρεις σελίδες για την εφαρμογή σας. Τώρα μάλλον θα θέλετε να τα γεμίσετε με διάφορα δεδομένα.

    Σε αυτό το μέρος θα μάθετε:

    • Πώς να συνδέσετε δεδομένα στη διεπαφή χρήστη.
    • Πώς το Visual Studio μπορεί να σας βοηθήσει να δημιουργήσετε δεσμεύσεις δεδομένων.
    • Πώς να εμφανίσετε δεδομένα σε μια λίστα.
    • Πώς να αντιμετωπίσετε πιο σύνθετα δεσμευτικά σενάρια.

    Σύνδεση δεδομένων στη διεπαφή χρήστη

    Η εφαρμογή Fuel Tracker έχει τρεις σελίδες δεδομένων. Τα δεδομένα αποθηκεύονται κυρίως σε τρεις κατηγορίες. Η παρακάτω εικόνα δείχνει τις σελίδες και τις σχετικές κλάσεις τους.

    Η σύνδεση δεδομένων χρησιμοποιείται συνήθως για την εμφάνιση δεδομένων. Η σύνδεση δεδομένων παρέχει τη δυνατότητα σύνδεσης μιας διεπαφής χρήστη σε μια πηγή δεδομένων. Όταν δημιουργούνται δεσμεύσεις και αλλάζει η πηγή δεδομένων, τα στοιχεία διεπαφής χρήστη που συνδέονται με την πηγή δεδομένων αντικατοπτρίζουν τις αλλαγές αυτόματα. Ομοίως, οι αλλαγές που γίνονται από τον χρήστη σε ένα στοιχείο διεπαφής χρήστη αντικατοπτρίζονται στην πηγή δεδομένων. Για παράδειγμα, εάν ο χρήστης αλλάξει μια τιμή σε ένα TextBox, η αντίστοιχη πηγή δεδομένων θα ενημερωθεί αυτόματα για να αντικατοπτρίζει αυτές τις αλλαγές.

    Το ακόλουθο απόσπασμα κώδικα XAML απεικονίζει τη σύνταξη που χρησιμοποιείται για τη σύνδεση της ιδιότητας Text ενός στοιχείου ελέγχου TextBox με την ιδιότητα Name του αντικειμένου προέλευσης.

    1. < TextBox x:Name ="NameTextBox" Text ="(Binding Name, Mode=TwoWay)" />

    Η παρακάτω εικόνα δείχνει ένα παράδειγμα τέτοιου δέσιμου.

    Κάθε δέσμευση έχει μια ιδιότητα Mode, η οποία καθορίζει πώς και πότε ενημερώνονται τα δεδομένα. Η δέσμευση OneWay σημαίνει ότι το στοιχείο διεπαφής χρήστη προορισμού ενημερώνεται εάν αλλάξει η πηγή. Η αμφίδρομη δέσμευση σημαίνει ότι τόσο ο στόχος όσο και η πηγή ενημερώνονται εάν αλλάξει κάποιο από αυτά. Εάν χρησιμοποιείτε συνδέσεις OneWay ή TwoWay, τότε για να ειδοποιηθεί η σύνδεση για αλλαγές στο αντικείμενο προέλευσης, πρέπει να εφαρμόσετε τη διεπαφή INotifyPropertyChanged. Αυτή η διεπαφή θα συζητηθεί με περισσότερες λεπτομέρειες στο επόμενο μέρος, «Δημιουργία κλάσεων δεδομένων».

    Καθορίζετε ένα αντικείμενο προέλευσης ορίζοντας την ιδιότητα DataContext. Εάν χρησιμοποιείτε ένα στοιχείο ελέγχου ListBox, πρέπει να καθορίσετε το αντικείμενο προέλευσης ορίζοντας την ιδιότητα ItemsSource. Το ακόλουθο παράδειγμα δείχνει πώς να ορίσετε την ιδιότητα DataContext ενός πίνακα CarHeader σε ένα αντικείμενο προέλευσης που ανακτήθηκε από μια στατική ιδιότητα.

    1. CarHeader.DataContext = CarDataStore.Car;
    * Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα.

    Η ιδιότητα DataContext σάς επιτρέπει να ορίσετε μια τυπική δέσμευση για ένα ολόκληρο στοιχείο διεπαφής χρήστη, συμπεριλαμβανομένων όλων των θυγατρικών του στοιχείων. Σε ορισμένες περιπτώσεις, θα είναι πιο βολικό να ορίσετε την ιδιότητα DataContext για ολόκληρη τη σελίδα και σε άλλες, θα σας φανεί πιο βολικό να τη ρυθμίσετε μεμονωμένα για κάθε στοιχείο της σελίδας. Η ρύθμιση του DataContext σε κάθε επίπεδο XAML παρακάμπτει τυχόν ρυθμίσεις σε υψηλότερο επίπεδο. Επιπλέον, μπορείτε πραγματικά να παρακάμψετε οποιαδήποτε ρύθμιση DataContext για μεμονωμένες δεσμεύσεις ορίζοντας την ιδιότητα Source.

    Για παράδειγμα, στην εφαρμογή Fuel Tracker, κάθε σελίδα ορίζει το DataContext σε διαφορετική τιμή. Ωστόσο, στη σελίδα FillupPageΤο DataContext σε επίπεδο σελίδας παρακάμπτεται για τον πίνακα που εμφανίζει το όνομα και τη φωτογραφία του αυτοκινήτου. Η παρακάτω εικόνα δείχνει τις ρυθμίσεις περιβάλλοντος δεδομένων για την εφαρμογή Fuel Tracker.

    Χρήση του εργαλείου δημιουργίας σύνδεσης δεδομένων

    Το Visual Studio περιλαμβάνει ένα εργαλείο δημιουργίας σύνδεσης δεδομένων για να σας βοηθήσει να δημιουργήσετε δεσμεύσεις δεδομένων στο XAML. Αν και το εργαλείο δημιουργίας σύνδεσης δεδομένων μπορεί να προσφέρει βελτιώσεις απόδοσης, δεν υποστηρίζει κάθε πιθανό σενάριο. Για παράδειγμα, δεν υποστηρίζει σύνδεση σε στοιχεία με ευρετήριο και δεν αναγνωρίζει δεσμεύσεις που δημιουργούνται σε κώδικα. Επομένως, σε ορισμένες περιπτώσεις θα χρειαστεί να καθορίσετε τις δεσμεύσεις δεδομένων με μη αυτόματο τρόπο.

    Εμφάνιση δεδομένων σε λίστα

    Η εμφάνιση μιας συλλογής στοιχείων σε μια λίστα είναι μία από τις κύριες εργασίες στο τηλέφωνό σας. Για να εμφανίσετε μια συλλογή στοιχείων σε μια λίστα χρησιμοποιώντας δέσμευση δεδομένων, πρέπει να κάνετε τα εξής:
    1. Προσθέστε ListBox στην εφαρμογή σας.
    2. Καθορίστε την προέλευση δεδομένων για το ListBox δεσμεύοντας τη συλλογή στην ιδιότητα ItemsSource.
    3. Για να προσαρμόσετε την εμφάνιση κάθε στοιχείου σε ένα ListBox, προσθέστε ένα πρότυπο δεδομένων για το ListBox.
    4. Στο πρότυπο δεδομένων, συνδέστε τα στοιχεία ListBox με τις ιδιότητες συλλογής στοιχείων.
    Η παρακάτω εικόνα δείχνει τις συνδέσεις για το ListBox στη σελίδα σύνοψης της εφαρμογής παρακολούθησης καυσίμου.

    Το ακόλουθο XAML δείχνει πώς καθορίστηκαν οι δεσμεύσεις για το ListBox.

    1. < ListBox ItemContainerStyle ="(StaticResource ListBoxStyle)"
    2. ItemsSource="(Binding FillupHistory)"
    3. Height="380" HorizontalAlignment="Αριστερό" Περιθώριο="5.25,0.0"
    4. VerticalAlignment="Top" Width="444" >
    5. < ListBox.ItemTemplate >
    6. < DataTemplate >
    7. < StackPanel Orientation ="Horizontal" >
    8. < TextBlock Style
    9. Κείμενο ="(Binding Date, Converter=(StaticResource StringFormatter), ConverterParameter=\(0:d\) )"
    10. Width="105" TextWrapping="Wrap" />
    11. < TextBlock Style ="(StaticResource SummaryStyle)"
    12. Κείμενο ="(Binding FuelQuantity)" TextWrapping ="Wrap" />
    13. < TextBlock Style ="(StaticResource SummaryStyle)"
    14. Κείμενο ="(Binding DistanceDriven)" TextWrapping ="Wrap" />
    15. < TextBlock Style ="(StaticResource SummaryStyle)"
    16. Text ="(Binding PricePerFuelUnit, Converter=(StaticResource StringFormatter), ConverterParameter=\(0:c\), ConverterCulture=en-US)" />
    17. < TextBlock Style ="(StaticResource SummaryStyle)"
    18. Κείμενο ="(Binding FuelEfficiency, Converter=(StaticResource StringFormatter), ConverterParameter=\(0:F\))" TextWrapping ="Wrap" />
    * Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα.

    Στο προηγούμενο XAML, η ιδιότητα ListBox.ItemsSource είναι δεσμευμένη στο Car.FillupHistoryώστε κάθε αντικείμενο Γεμίσουνστη συλλογή ιστορικού θα εμφανιστεί ως ξεχωριστό στοιχείο στο ListBox. Το στοιχείο DataTemplate ορίζει την εμφάνιση κάθε στοιχείου και περιέχει πολλά στοιχεία TextBlock, καθένα από τα οποία είναι δεσμευμένο σε μια ιδιότητα κλάσης Γεμίσουν.

    Αυτό το XAML θα λειτουργήσει μόνο όταν το αντικείμενο Αυτοκίνητοσυσχετίζεται πρώτα με τη σελίδα, όπως φαίνεται στον παρακάτω κώδικα από το SummaryPage.xaml.cs.

    1. αυτό το .DataContext = CarDataStore.Car;
    * Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα.

    Συμβουλή για τη βελτίωση της απόδοσης:
    Εάν η κύλιση στο ListBox σας δεν φαίνεται ομαλή και αποκρίνεται, δοκιμάστε αυτές τις συμβουλές:
    • Απλοποιήστε τα στοιχεία στο ListBox.
    • Φόρτωση εικόνων στο παρασκήνιο.
    • Χρησιμοποιήστε εικονικοποίηση δεδομένων.
    • Σημειώστε τη χρήση του DeferredLoadListBox ή του LazyListBox.
    • Μην χρησιμοποιείτε ένθετες λίστες.

    Σύνθετες διαδρομές σύνδεσης

    Εκτός από την ευελιξία της ρύθμισης της ιδιότητας DataContext σε οποιοδήποτε επίπεδο (που σας επιτρέπει να παρακάμψετε ρυθμίσεις σε υψηλότερο επίπεδο), μπορείτε επίσης να καθορίσετε σύνθετες διαδρομές δέσμευσης για να διερευνήσετε τις ιδιότητες αναφοράς, όπως π.χ. Car.FillupHistory. Για παράδειγμα, το ακόλουθο XAML από το SummaryPage.xaml δείχνει τη σύνδεση ιδιοτήτων Fillup.FuelEfficiencyτο πρώτο στοιχείο στη συλλογή της ιστορίας του βενζινάδικου.
    1. < TextBlock Text ="(Binding FillupHistory.FuelEfficiency, Converter=(StaticResource StringFormatter), ConverterParameter=\(0:F\))" />
    * Αυτός ο πηγαίος κώδικας επισημάνθηκε με το εργαλείο επισήμανσης πηγαίου κώδικα.

    Η ακόλουθη εικόνα δείχνει τις συνδέσεις στο SummaryPage.xaml και δείχνει πώς οι σύνθετες συνδέσεις δεδομένων και τα πρότυπα σάς επιτρέπουν να συνδέετε στοιχεία ελέγχου σε διαφορετικές ιδιότητες διαφορετικών αντικειμένων, ακόμα κι αν ανήκουν όλα στο ίδιο DataContext.

    Τα πράσινα ορθογώνια στην αριστερή οθόνη Συγκεντρωτικής οθόνης εμφανίζουν στοιχεία ελέγχου που αποσπώνται χρησιμοποιώντας σύνθετες διαδρομές. Αυτές οι διαδρομές ξεκινούν από το πρώτο στοιχείο (ευρετήριο 0) στη συλλογή Car.FillupHistoryκαι τελειώνουν με διάφορες ιδιότητες κλάσης Γεμίσουν. Για παράδειγμα, το πεδίο Current MPG χρησιμοποιεί τη διαδρομή δέσμευσης FillupHistory.FuelEfficiency. Εάν συμπεριλάβετε τη ρύθμιση DataContext της σελίδας σε αυτήν τη διαδρομή, ολόκληρη η διαδρομή δέσμευσης θα μοιάζει με αυτό: CarDataStore.Car.FillupHistory.FuelEfficiency.

    Ετικέτες:

    • windows phone 7
    • δημιουργία μιας εφαρμογής
    • από την αρχή μέχρι το τέλος
    Προσθέστε ετικέτες