4 votes

Le texte de TextBox défini à travers DataTrigger ne met pas à jour la valeur de la propriété dans le modèle

Je suis nouveau sur WPF et je veux effacer la valeur d'une zone de texte si une case à cocher n'est pas cochée. J'ai essayé de le faire à travers des déclencheurs de données.

Voici le code :

                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                                    <Setter Property="TextBox.Text" Value="{x:Null}"></Setter>
                                </DataTrigger>  
                            </Style.Triggers>

La valeur de ma case à cocher est définie dans la propriété "IsSelected" de mon modèle. Ici, si la case à cocher n'est pas cochée, alors la valeur mise à jour du texte, qui est {x:Null} dans ce cas, ne se reflète pas dans la propriété "Amount" de mon modèle. À cause de cela, le texte ne semble jamais être changé sur l'interface utilisateur. La valeur précédemment définie pour "Amount" est à nouveau définie dans la zone de texte à cause de la liaison.

Toute aide est appréciée. Faites-moi savoir si vous avez besoin de plus d'informations ou de clarifications. Merci.

7voto

Viv Points 15531

Dans de tels cas, je préfère normalement que le ViewModel / Modèle effectue la partie "de nettoyage" de la fonctionnalité,

donc dans votre cas, je ferais normalement quelque chose comme:

public bool EstSelectionné {
  get {
    return _estSelectionné;
  }

  private set {
    if (valeur == _estSelectionné)
      return;

    LeverL'événementChangementPropriété(() => EstSelectionné);
    _estSelectionné = valeur;
    PropagerChangement(() => EstSelectionné);

    si (_estSelectionné == false)
      Montant = string.Empty
  }
}

De cette façon, la Vue n'a pas la responsabilité de toute logique et n'a donc besoin d'aucun DataTrigger du tout

Mise à jour:

Le problème avec votre code est lorsque vous définissez le Texte avec une liaison dans le TextBox, cela prend le pas sur la valeur que vous avez définie dans le Style pour la propriété Texte. Vous pouvez vérifier cela en utilisant ceci:

      <Setter Property="Text"
              Value="{Binding Path=Montant,
                              Mode=TwoWay}" />
      <Style.Triggers>
        <DataTrigger Binding="{Binding Path=EstSelectionné}"
                      Value="false">
          <Setter Property="Text"
                  Value="{x:Null}" />
        </DataTrigger>
      </Style.Triggers>

Cela effacera maintenant le Texte lorsque la Case à cocher est cochée, cependant cela ne mettra pas à jour votre liaison(Montant) car essentiellement votre liaison n'est active que lorsque la Case à cocher est sélectionnée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X