2009-12-09 7 views
1

j'ai une simple case à cocherWPF CheckBox Reliure - Valeur Modification en jeu de propriétés n'affecte pas l'interface utilisateur

<CheckBox IsChecked="{Binding ForceInheritance}"/> 

Dans le code j'ai une classe avec "INotifyPropertyChanged" et la propriété

public bool ForceInheritance 
{ 
    get { return forceInheritance; } 

    set 
    { 
    if (forceInheritance != value) 
    { 
     value = SomeTest(); 

     if (forceInheritance != value) 
     { 
     //something is done here. 
     } 

     OnPropertyChanged("ForceInheritance"); 
    } 
    } 
} 

Si SomeTest() renvoie! value pour que les données sous-jacentes n'aient pas besoin de changer CheckBox change toujours son état IsChecked.

Par exemple:
ForceInheritance est false.
CheckBox est cliqué.
SomeTest() renvoie la valeur false.
-> Les données sous-jacentes ne sont pas modifiées
-> Je m'attendrais à ce que la CheckBox reste non cochée
CheckBox est vérifié. Que puis-je faire pour ne pas modifier l'état IsChecked du CheckBox lorsque le setter ne modifie pas réellement la valeur?

Je pensais que "OnPropertyChanged (" ForceInheritance ");" ferait l'affaire mais ce n'est pas le cas.

Nous vous remercions de votre temps.

Répondre

1

Ce problème se produit car lorsque vous cliquez sur la case à cocher, sa valeur est modifiée. Ensuite, la liaison provoque l'ensemble de propriétés. Là vous manipulez avec sa valeur et vous espérez qu'appeler OnPropertyChanged provoquera la mise à jour de la valeur de case à cocher de l'action de liaison. Mais cela ne fonctionne pas car la mise à jour du contrôle après la mise à jour de la propriété peut produire une boucle de mise à jour infinie. Pour empêcher ce PropertyChanged est ignoré.

Que pouvez-vous faire pour déplacer la logique de votre setter de propriété vers la règle de validation de liaison. Vous pouvez lire here sur les règles de validation ou laisser un commentaire si vous avez besoin de plus d'informations ou d'exemples.

Espérons que ça aide.

+0

Bonjour! Je pensais que OnPropertyChanged() déclencherait le getter et non le setter à nouveau. Mais merci votre réponse cela m'a conduit à une solution. Validation utilisée comme suggéré. Lorsque setter ne changeait pas la valeur sous-jacente, j'ai créé un message d'erreur. Lors du renvoi d'un message d'erreur de validation, d'un message d'erreur supprimé et d'un appel OnPropertyChanged(). -> getter est appelé avec la valeur correcte -> CheckBox reste décoché. – user227882