Bonjour, j'ai un petit soucis de prise en compte d'un binding non pas sur une simple propriété de mon modèle mais sur une liste d'objets.
L'énoncé est le suivant, (ça risque d'être long...
) :
ps : Génial, je viens de virer tout ce que j'ai écrit depuis 10 minutes en faisant un malencontreux ctrl+w
...
...
Bon c'est reparti :
Donc on va dire (pour simplifier) que mes objets c'est des formule 1, chaque F1 a deux propriété : couleur et vitesse max.
Dans mon model, j'ai une liste de F1 (List<F1>) appelée ListeF1 (10 F1 précisément dans la liste) (la classe F1 est INotifyPr... avec les setter correctement complétés).
Dans ma vue, j'ai 10 UserControl qui détaille une F1 à la fois, c'est bindé dans le xaml de la manière suivante :
1 2 3 4
| ...
Couleur="{Binding Model.ListeF1[0].Couleur}"
VMax="{Binding Model.ListeF1[0].VMax}"
... |
Dans le ViewModel dans ma méthode actualiser, je met à jour la List<F1> (les F1 sont toujours les même,on garde 10 objets, on ne doit pas en ajouter ou en supprimer, je met juste à jour les propriétés des F1) de mon modèle et ça répercute automatiquement les changements sur les propriétés de chaque F1 dans les Control de la vue (grâce au fait que F1 soit INoti...).
Pour que ça marche, dans le UserControl, on utilise une dependency property pour enregistrer chaque propriété et récupérer les notif des mise à jour :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #region Couleur
public ushort Couleur
{
get
{
return (ushort)GetValue(CouleurProperty);
}
set
{
SetValue(CouleurProperty, value);
}
}
public static readonly DependencyProperty CouleurProperty =
DependencyProperty.Register(
"Couleur",
typeof(ushort),
typeof(UcMiseEnOeuvreMono),
new FrameworkPropertyMetadata(
new PropertyChangedCallback(ChangeCouleur)));
private static void ChangeCouleur(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
(source as UcMiseEnOeuvreMono).UpdateCouleur((ushort)e.NewValue);
}
private void UpdateCouleur(ushort Couleur)
{
ucMiseEnOeuvreDepart.Couleur = Couleur;
}
#endregion |
On arrive au soucis, j'ai un autre UserControl qui permet de gérer les 10 F1 d'un coup. Et donc au binding, je ne souhaite pas binder chaque propriété de chaque F1 dans le xaml et donc me retaper les dependency property * le nombre de f1 * le nombre de propriétés dans le code behind de l'user control.
L'idée c'est donc de binder dans le xaml ma liste elle même :
1 2 3
| ...
ListeF1="{Binding Model.ListeF1}"
... |
Je créé donc une dependency property dans le .cs de l'userControl sur la liste de F1.
En démarrant mon application je constate que le nouvel userControl s'affiche correctement la première fois que je l'affiche, mais ensuite toute mise à jour sur l'une des F1 n'est pas répercutée sur ma vue comme c'est le cas des autres contrôles (mono F1)
.
J'ai transformé la liste en une ObservableCollection et je me suis rendu compte que les modifications sur les propriétés des éléments ne sont pas notifiés, alors j'ai essayé de les notifier en accrochant un PropertyChanged sur chaque F1 pour déclencher un RaisePropertyChanged mais rien n'y fait le binding dans le xaml marche juste la 1ère fois et ensuite il ne se met pas à jour même en faisant un RaisePropertyChanged sur la liste de F1.
nb : par RaiseProperty j'entend :
NotifyPropertyChanged("ListeF1");
avec la méthode :
1 2 3 4 5 6 7
| private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
} |
sachant que le binding dans le xaml est celui ci :
1 2 3
| ...
ListeF1="{Binding Model.ListeF1}"
... |
et que la dependencyProperty dans le .cs du contrôle est enregistrée sur "ListeF1" :
1 2 3 4 5 6 7
| public static readonly DependencyProperty DepartsProperty =
DependencyProperty.Register(
"ListeF1",
typeof(List<Uti.F1>),
typeof(UcMiseEnOeuvreGlobale),
new FrameworkPropertyMetadata(
new PropertyChangedCallback(ChangeDeparts))); |
Vous connaissez la/une solution ou vous en avez une meilleure ?
Merci d'avance.
Partager