[MVVM/WPF] Binding et DependencyProperty avec une ObservableCollection

Binding et DependencyProperty avec une ObservableCollection [MVVM/WPF] - C#/.NET managed - Programmation

Marsh Posté le 24-04-2012 à 18:07:36    

Bonjour, j'ai un soucis qui me prends la tête depuis maintenant un bon moment et je ne parviens pas a trouver la solution...
 
J'utilise une librairie qui permet de construire des graphiques, c'est OxyPlot ( http://oxyplot.codeplex.com/ sources dispo ) globalement elle marche bien sauf que, de base, la propriétés permettant de définir les différentes Séries n'est pas "bindable" malgré le fait que ce soit une ObservableCollection<>. Mon but étant de créer/effacer des séries "à la volée" je cherche a obtenir ce comportement.
 
J'ai donc d'abord essayer de surcharger le Plot en y ajoutant une propriété SeriesSource qui irait modifier les Series de mon graphique.
 

Code :
  1. class MyChartSeries : Plot
  2.    {
  3.       public MyChartSeries()
  4.       {
  5.          this.SeriesSource = new ObservableCollection<Series>();
  6.          this.SeriesSource.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(SeriesSource_CollectionChanged);
  7.       }
  8. public ObservableCollection<Series> SeriesSource
  9.       {
  10.          get { return (ObservableCollection<Series> )GetValue(SeriesSourceProperty); }
  11.          set { SetValue(SeriesSourceProperty, value); }
  12.       }
  13.       // Using a DependencyProperty as the backing store for SeriesSource.  This enables animation, styling, binding, etc...
  14.       public static readonly DependencyProperty SeriesSourceProperty =
  15.           DependencyProperty.Register("SeriesSource", typeof(ObservableCollection<Series> ), typeof(MyChartSeries),
  16.           new UIPropertyMetadata(null, OnListPropertyChanged));
  17.       private static void OnListPropertyChanged(DependencyObject source,
  18.         DependencyPropertyChangedEventArgs e)
  19.       {
  20.          MyChartSeries control = source as MyChartSeries;
  21.          control.SeriesSource = (ObservableCollection<Series> )e.NewValue;
  22.          // Put some update logic here...
  23.       }
  24. }


 
Mon OnListPropertyChanged (dans cet exemple il ne fait pas grand chose mais c'est pour illustrer) n'est appelé qu'une fois a la construction de mon ViewModel puis après plus rien.
 
Dans mon ViewModel je crée juste une ObservalbleCollection<Series> que je bind en XAML sur SeriesSource de mon MyChartSeries:
 

Code :
  1. <local:MyChartSeries Margin="0" Grid.Column="2" SeriesSource="{Binding ListeSeries, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  2. <local:MyChartSeries.Axes>
  3. <OxyPlot_Wpf:DateTimeAxis Position="Bottom" FirstDateTime="2012-01-01" LastDateTime="2012-01-03" MinorIntervalType="Days"/>
  4. <OxyPlot_Wpf:LinearAxis EndPosition="0" Maximum="100" StartPosition="1"/>
  5. </local:MyChartSeries.Axes>
  6. </local:MyChartSeries>


 
Je lance bien dans mon VM un RaisePropertyChanged("ListeSeries" ) (MVVM light) mais rien ne se passe au niveau du graphe...
 
Ensuite je suis allé télécharger les sources et j'ai regardé un peu le fonctionnement mais je n'ai pas vraiment réussi a trouver comment modifier directement Series pour qu'il devienne bindable :(.
 
Voilà les quelques parties de codes qu'il contient a ce sujet:
 
Dans le constructeur de Plot.cs

Code :
  1. this.series = new ObservableCollection<Series>();
  2. ...
  3. this.series.CollectionChanged += this.OnSeriesChanged;


 
Dans Plot.Properties.cs

Code :
  1. /// <summary>
  2. ///   The series.
  3. /// </summary>
  4. private readonly ObservableCollection<Series> series; << Définition du this.series de Plot.cs
  5. /// <summary>
  6. ///   Gets the series.
  7. /// </summary>
  8. /// <value> The series. </value>
  9.      public ObservableCollection<Series> Series
  10.      {
  11.          get
  12.          {
  13.              return this.series;
  14.          }
  15.      }


 
J'ai essayé de rajouter une DependencyProperty sur Series en remplaçant le getter/setter de la même façon que pour ma surcharge mais ça ne fonctionne pas mieux. J'ai bien la possibilité de mettre un binding mais il ne se passe rien lorsque je modifie ma liste de séries.
 
Il y a pourtant tout un tas de dependencyProperty dans le fichier Plot.Properties mais aucune collection, que des objets "uniques" donc je pense qu'il me manque quelque chose (une implémentation des notifications de la collection? autre chose?) mais je n'arrive pas a mettre le doigt dessus.
 
Après via surcharge ou en modifiant la source peu importe mais j'aimerai vraiment que quand je change ma liste dans mon VM hop ça me reconstruise le graphe avec les séries qui vont bien...
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 24-04-2012 à 18:07:36   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed