Στο 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