Ceci est ma première question, je m'excuse si elle n'est pas parfaitement formatée. Je suis nouveau à WPF et MVVM et j'ai rencontré un problème que je n'arrive pas à comprendre.Prévention des boucles infinies lors de l'utilisation de INotifyPropertyChanged avec une arborescence WPF contenant des cases à cocher
J'ai une vue arborescente qui affiche une hiérarchie MenuItem avec une case à cocher par MenuItem, à la fois pour les nœuds parent et enfant. La solution actuelle permet à un utilisateur de cliquer sur un nœud parent et tous les éléments enfants sont cochés/décochés si nécessaire.
Je dois maintenant mettre en œuvre l'inverse de cela, où si un utilisateur clique sur l'un des nœuds enfants, le nœud parent doit être sélectionné s'il n'est pas déjà sélectionné. Le problème que j'ai actuellement est que la vérification du nœud parent déclenche par programmation l'événement INotifiedPropertyChanged pour le nœud parent qui revérifie mes nœuds enfants.
Comment puis-je empêcher cela?
Voici mon code MenuItem:
public class MenuItem : INotifyPropertyChanged
{
string _name;
List<MenuItem> _subItems = new List<MenuItem>();
bool _isChecked;
MenuItem _parent;
public List<MenuItem> SubItems
{
get { return _subItems; }
set
{
_subItems = value;
RaisePropertyChanged("SubItems");
}
}
public string Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
RaisePropertyChanged("IsChecked");
}
}
public MenuItem Parent
{
get { return _parent; }
set
{
_parent = value;
RaisePropertyChanged("Parent");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
if (propertyName == "IsChecked")
{
if (Parent == null)
{
foreach (MenuItem Child in _subItems)
Child.IsChecked = this.IsChecked;
}
//if (Parent != null)
//{
// Parent.IsChecked = IsChecked ? true :Parent.IsChecked;
//}
}
}
}
Le code commenté ci-dessus est l'endroit où je rencontre l'erreur.
Toute indication sera grandement appréciée.
vous pourriez essayer de ne déclencher l'événement que si la valeur est réellement différente de la valeur actuelle – Nico
La valeur doit toujours être différente. J'ai fondamentalement besoin que l'événement PropertyChanged se déclenche uniquement s'il n'est pas appelé par une méthode. – ThatChris
ce n'est pas la réponse, mais un commentaire préliminaire sur votre approche. N'implémentez pas cette logique dans RaisePropertyChanged! À mon humble avis, il est plus approprié de mettre en œuvre cette demande dans les vérificateurs correspondant ... alors, bien sûr, la réponse concrète devrait suivre ... –