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

 

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

WPF και Data Binding σε chart....!

Îåêßíçóå áðü ôï ìÝëïò kos6101991. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 28-05-2012, 11:22. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-04-2012, 21:07 70112

    WPF και Data Binding σε chart....!

    Θελω να φτιαξω ενα Chart με CollumSeries Score και στον χ αξονα να εχει ονοματα και  στον αξονα ψ να εχει εναν αριθμο το CollumSeries βρηκα πως να το βαλω ...πως ομως βαζω τιμες στους αξονες χ,ψ  αυτο δεν το   γνωριζω.και πως θετω μια τιμη σε μια κολωνα του chart....?

    Οποιος μπορει ας με βοηθησει ειναι ΑΝΑΓΚΗ!!! ευχαριστω

     

     

    ΥΓ. Εννοειται πως δεν μιλαω για δεδομενα απο βαση θελω εγω να δινω τα δεδομενα στο chart....

  •  25-04-2012, 10:39 70127 σε απάντηση της 70112

    Απ: WPF και Data Binding σε chart....!

    Στο WPF και το Silverlight (και στα Windows Forms εδώ που τα λέμε) δεν "βάζεις" τιμές σε ένα control, του λες να κάνει bind σε ένα datasource, π.χ σε ένα αντικείμενο ή λίστα αντικειμένων. Όλα τα controls που δείχνουν πολλαπλά αντικείμενα.

    Στο WPF και το Silverlight όλα τα control που δείχνουν πολλαπλά αντικείμενα έχουν το ItemsSource στο οποίο δίνεις τη λίστα (γενικά οποιοδήποτε IEnumerable) την οποία θέλεις να δείξεις. Μετά σε άλλα properties δίνεις το binding για τα στοιχεία που θέλεις να εμφανιστούν.

    Για παράδειγμα, έχω ορίσει την κλάση:
     public class Watchamacalum
        {
            public double Mee { get; set; }
            public double Moo { get; set; }
            public string Name { get; set; }
        }
    Την οποία θέλω να δείξω σε ένα chart. Απλά προσθέτω τη λίστα στον κώδικα μου ως property:

    public partial class MainWindow : Window
        {
            public List<Watchamacalum> Boos{get;set;}
    
            public MainWindow()
            {
                InitializeComponent();
                Boos = new List<Watchamacalum>
                           {
                               new Watchamacalum {Name="Da First", Mee = 1, Moo = 2},
                               new Watchamacalum {Name="Da Second",Mee = 2, Moo = 2.1},
                               new Watchamacalum {Name="Da Third",Mee = 3, Moo = 2.7}
                           };
                this.DataContext = this;
            }
        }
    Το σημαντικό εδώ είναι ότι ΔΕΝ είναι υποχρεωτικό να κάνω bind σε property της φόρμας. Τα δεδομένα μπορούν να έρχονται από οποιοδήποτε αντικείμενο, φτάνει να το δώσω στο DataContext property της φόρμας. Έτσι μπορώ να ξεχωρίσω εντελώς τη φόρμα μου από τα δεδομένα, κάτι ΠΟΛΥ ΠΟΛΥ καλό. Εδώ απλά επειδή βαριόμουν, έβαλα το DataContext=this. 

    Τώρα το chart μου είναι το εξής:
    <chartingToolkit:Chart 
                                   HorizontalAlignment="Stretch" 
                                   Margin="5" Name="chart1" 
                                   Title="Le Chart" 
                                   VerticalAlignment="Stretch">
                <chartingToolkit:ColumnSeries 
                    Title="Ma Series" 
                    ItemsSource="{Binding Boos}"
                    IndependentValuePath="Mee" 
                    DependentValuePath="Moo"                 
                     />
            </chartingToolkit:Chart>

    Όπως βλέπεις, πουθενά δεν πείραξα το chart, ούτε καν ξέρει ο κώδικας μου ότι υπάρχει chart. Απλά είπα στο chart πού να βρει τη λίστα και ποιά properties να δείξει. Μπορώ έτσι να προσθέσω και άλλα series τα οποία θα κάνουν bind σε άλλα δεδομένα, ή στα ίδια και θα δείχνουν άλλα πεδία κλπ.

    Αν τώρα θέλω το chart να ανανεώνεται αυτόματα όταν προσθέτω κάποια τιμή στη λίστα, θα πρέπει κάπως να ειδοποιήσω το control ότι αλλάξανε τα δεδομένα. Αυτό γίνεται μέσω του INotifyPropertyChanged interface, το οποίο δεν υλοποιείται από το List<T>. Αντί γι αυτό μπορώ να αλλάξω τον τύπο της λίστας σε ObservableCollection<T>. Τώρα κάθε φορά που κάνω Boos.Add θα ανανεώνεται και το γράφημα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  27-05-2012, 13:12 70400 σε απάντηση της 70127

    Απ: WPF και Data Binding σε chart....!

    Επειδη θελω το chart  να παιρνει τιμες απο τηνβαση μου...πρεπει δηλ. η λιστα ας πουμε να παιρνει αυτες τις τιμες και να τις δινει στο chart....μπορω να χρησιμοποιησω και κατι αλλο η μονο λιστα .θελω να υπαρχει η δυνατοτητα update.Τι με συμφερει να χρησιμοποιησω??

    Ευχαριστω.
  •  28-05-2012, 10:30 70405 σε απάντηση της 70400

    Απ: WPF και Data Binding σε chart....!

    Δηλαδη για να τροφοδοτησω ενα chart μπορω να το κανω και μεσω ενος dataset???
  •  28-05-2012, 11:22 70407 σε απάντηση της 70400

    Απ: WPF και Data Binding σε chart....!

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

    Καταρχήν "παίζω κατευθείαν με τη βάση" δεν ισχύει ποτέ. Ποτέ δεν παίζεις κατευθείαν με τη βάση. Πάντα διαβάζεις τα στοιχεία και τα μεταφέρεις σε μία δομή. Αργότερα, μεταφέρεις τις αλλαγές που έκανες στη δομή πίσω στη βάση. Αυτό ισχύει τόσο για τα Datasets όσο και για λίστες, πίνακες ή collections. Από τη στιγμή που υπάρχουν ORMs όπως το NHibernate, Entity Framework ή LINQ to SQL είναι προτιμότερο να δουλέψεις με λίστες παρά με datasets.  

    Αν κρίνω από τον κώδικα που έγραψες στην άλλη ερώτηση, το πρόβλημα είναι ότι δοκίμασες να φορτώσεις ένα dataset χωρίς να χρησιμοποιήσεις binding, όπως έκανες ίσως στα Windows Forms με το DataSource. 

            private void Window_Loaded(object sender, RoutedEventArgs e)
            { cn = new SqlConnection("Data Source=KOSTAS-PC;Initial Catalog=form;Integrated Security=True");
                cn.Open();
                da = new SqlDataAdapter("select * from krithrio1", cn);
                ds = new DataSet();
                da.Fill(ds);
                LineSeries1.ItemsSource=ds.Tables[0].DefaultView;
            }
    Καταρχήν, ο κώδικας θα έπρεπε να δουλεύει αν υπήρχαν δεδομένα στον πίνακα. Δεν είναι όμως αυτός ο σωστός τρόπος να δουλέψεις με WPF.

    Το data binding στο WPF δεν δουλεύει έτσι. Αν κρατήσεις το ίδιο ακριβώς XAML όπως προηγουμένως, αλλά αλλάξεις τον τύπο του data structure σε DataTable, θα δεις ότι δουλεύει: 
            public DataTable Boos { get; set; }
           
            public MainWindow()
            {
                InitializeComponent();
                this.DataContext = this;
    
                Boos = new DataTable();
                using (var connection = new SqlConnection(Settings.Default.MyConnection))
                {
                    var cmd = new SqlCommand("select DataName As Mee,DataValue As Moo from Table_1",connection);
    
                    connection.Open();
                    using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        Boos.Load(reader);
                    }
                }
            }
    Και εδώ βλέπεις το φοβερό πλεονέκτημα του WPF: Παρότι άλλαξα τον τύπο της δομής σε κάτι εντελώς άσχετο, το ίδιο ακριβώς XAML συνεχίζει να παίζει.

    Data Binding μπορεί να γίνει γίνεται σε οποιοδήποτε τύπο. Ο λόγος που όλοι προτιμούν κάτι που κληρονομεί από το IEnumerable<> (όπως λίστες, arrays) είναι ότι είναι απείρως βολικότερο να δουλεύεις με αυτά απ' ότι με ένα DataTable αγνώστων στηλών. 

    Θα πρότεινα καταρχήν να κοιτάξεις το documentation για το data binding καθώς και το Walkthrough: Binding WPF Controls to a Dataset

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems