Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με Data Binding

Îåêßíçóå áðü ôï ìÝëïò JohnL. Τελευταία δημοσίευση από το μέλος JohnL στις 14-02-2009, 00:22. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-01-2009, 15:05 48009

    Πρόβλημα με Data Binding

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

    <Window x:Class="WpfApplication2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="600" Loaded="Window_Loaded">
    <Grid>
    <ListView Margin="8,8,8,36" Name="lv">
    <ListView.View>
    <GridView>
    <GridViewColumn Width="180" Header="Title" DisplayMemberBinding="{Binding Title}" />
    <GridViewColumn Width="180" Header="Date" DisplayMemberBinding="{Binding Data}" />
    </GridView>
    </ListView.View>
    </ListView>
    <Button Height="30" HorizontalAlignment="Left" Margin="8,0,0,0" Name="button1" VerticalAlignment="Bottom" Width="96" Click="button1_Click">Button</Button>
    <Button Height="30" HorizontalAlignment="Left" Margin="110,0,0,0" Name="button2" VerticalAlignment="Bottom" Width="96" Click="button2_Click">Button</Button>
    </Grid>
    </Window>


    public partial class Window1 : Window
    {
    public Window1()
    {
    InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
    lv.ItemsSource = _Books;
    }

    ObservableCollection<Book> _Books = new ObservableCollection<Book>();
    public ObservableCollection<Book> Books { get { return _Books; } }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
    Book tmp = new Book();
    _Books.Add(tmp);
    tmp.Title = "dfgedrhgehg";
    _Books[_Books.Count-1].Data = "ergserg"; // enimerwnetai to ListView
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
    _Books[0].Data = "data modified"; // den enimerwnetai to ListView!!!
    }

    }


    public class Book
    {
    public string Title { get; set; }
    public string Data { get; set; }
    }

  •  29-01-2009, 16:58 48011 σε απάντηση της 48009

    Απ: Πρόβλημα με Data Binding

    Δοκίμασε να υλοποιήσεις το INotifyPropertyChanged στην κλάση Book.

    [edit] Ναι, αυτό είναι, είμαι σίγουρος. Δυστυχώς δεν έχω χρόνο να σου εξηγήσω γιατί συμβαίνει αυτό, θα πρέπει να διαβάσεις το documentation. Δες επίσης το INotifyCollectionChanged που υλοποιεί το ObservalbleCollection.


    Vir prudens non contra ventum mingit
  •  29-01-2009, 18:28 48013 σε απάντηση της 48011

    Απ: Πρόβλημα με Data Binding

    Διάβασα σε ένα βιβλίο ότι το WPF δεν αναγνωρίζει για binding events από κλάσεις που υλοποιούν το INotifyPropertyChanged, οπότε το έκανα έτσι:

    public class Book
    {
    private string _Title;
    public string Title
    {
        get { return _Title; }
        set
        {
           _Title = value;
           OnTitleChanged();
        }
    }

    public event EventHandler TitleChanged;
    private void OnTitleChanged()
    {
        if (TitleChanged != null)
           TitleChanged(this, EventArgs.Empty);
    }

    private string _Data;
    public string Data
    {
        get { return _Data; }
        set { _Data = value; }
    }
    }


    Και όντως δούλεψε... Όμως έχω σε αυτήν την κλάση 20 περίπου properties... Θα πρέπει να το υλοποιήσω για κάθε μία ξεχωριστά?

    Επίσης, δεν καταλαβαίνω στο πρώτο παράδειγμα γιατί δουλεύει τη μία φορά, ενώ την άλλη όχι... Μου φαίνεται πολύ περίεργο και το documentation δε με βοήθησε ιδιαιτερα σε αυτό..
  •  30-01-2009, 05:11 48025 σε απάντηση της 48013

    Απ: Πρόβλημα με Data Binding

    Βασικά να ξεκινήσω λέγοντας πως μου φαίνεται αρκετά περίεργο τα WPF controls να μην υποστηρίζουν το INotifyPropertyChanged. Είσαι σίγουρος για αυτό;

    Αυτό που έκανες στο τελευταίο παράδειγμα είσαι σίγουρος ότι τα controls ενημερώνονται αυτόματα όταν αλλάζεις τον τίτλο; Από WPF δεν γνωρίζω τίποτα αλλά τα απλά μέχρι τώρα που δουλεύω εδώ και χρόνια τα καταλαβαίνω απόλυτα. Οπότε μου είναι αρκετά περίεργο το γεγονός ότι το List ενημερώνεται αυτόματα για τις αλλαγές που γίνονται πίσω στο object μέσω ενός custom event που λέγεται TitleChanged.

    Όσο για το πρώτο παράδειγμα με τις αλλαγές, αυτό που βλέπουμε εδώ είναι όλος ο κώδικας από την συγκεκριμένη class; Αν ναι αυτό είναι κάτι αρκετά περίεργο και προσωπικά δεν το καταλαβαίνω τι μία να σου ενημερώνει το control και την άλλη όχι.

  •  30-01-2009, 12:56 48037 σε απάντηση της 48025

    Απ: Πρόβλημα με Data Binding

    Σχετικά με το πρώτο παράδειγμα, ναι αυτός είναι όλος ο κώδικας... Κι εμένα μου φαίνεται πολύ περίεργο...

    Στο δεύτερο παράδειγμα, ναι ενημερώνονται αυτόματα μόλις αλλάζω τον τίτλο. Απ' ότι καταλαβαίνω, το WPF "ακούει" για events με το αντίστοιχο όνομα της property (OnTitleChanged για την Title, OnDataChanged για την Data) και ενημερώνει τα bound controls...

    Και όσον αφορά το INotifyPropertyChanged, μια και δεν ήμουν σίγουρος, το δοκίμασα και όντως και αυτό παίζει τελικά.. Έχει διαφορά ποιόν τρόπο από τους δύο θα διαλέξω (το custom Event ή το INotifyPropertyChanged)?
  •  30-01-2009, 22:38 48049 σε απάντηση της 48037

    Απ: Πρόβλημα με Data Binding

    Η αλήθεια είναι ότι δεν γνωρίζω τίποτα από WPF controls για να σου πω αν παρακολουθούν τα events του object και αν αλλάξει κάτι να ενημερώνονται. Ίσως κάποιος πιο ειδικός να μπορούσε να σου εξηγήσει.

    Όσο για την δεύτερη απορία σου θα σου έλεγα να χρησιμοποιήσεις το INotifyPropertyChanged, αλλά μιλάμε για WPF οπότε η γνώμη μου είναι απλά πληροφοριακή. Κάποιος που έχει ασχοληθεί θα μπορούσε να σου πει. Απλά μου φάνηκε περίεργο να μην υποστηρίζεται πλέον γιατί όλες oi Bindable συλλογές και controls το λαμβάνουν υπόψιν. Δεν είναι απλά ένα interface που αν θέλουμε υλοποιούμε στα objects μας, αλλά με βάση αυτό το interface η λειτουργία binding δουλεύει σωστά.

    Αλλά και πάλι η πρώτη φορά θα είναι που αλλάζει κάτι στον τρόπο προγραμματισμού;

  •  01-02-2009, 22:59 48073 σε απάντηση της 48037

    Απ: Πρόβλημα με Data Binding

    H τεχνική με τα OnTitleChanged, OnDataChanged, κλπ, είναι ο τρόπος που υποστήριζαν data binding τα objects επί εποχής .NET Framework 1.1. To INotifyPropertyChanged εμφανίστηκε στο .NET Framework 2.0 και ισχύει από τότε (δες σχετική κουβέντα εδώ). Προφανώς, ο data binding μηχανισμός του WPF υποστηρίζει για λόγους συμβατότητας και την προηγούμενη υλοποίηση. Γενικά το INotifyPropertyChanged επιτρέπει πιο "καθαρά" impementations και πιο "έξυπνα" αν το συνδυάσεις με ολίγη από reflection και caching των event args. Τέλος, στο WPF υπάρχει και η επιλογή του να φτιάξεις custom dependency properties για τις κλάσεις σου και να κάνεις bind σε αυτά. Τα dependency properties είναι *μαγικά* properties, properties σε στεροειδή και ανάμεσα στα άλλα επιτρέπουν στον binding μηχανισμό να επεκταθεί και στο styling και στο animation.
    Vir prudens non contra ventum mingit
  •  14-02-2009, 00:22 48421 σε απάντηση της 48073

    Απ: Πρόβλημα με Data Binding

    Μάλιστα...

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

    Ευχαριστώ!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems