WPF zone de texte valeur ne change pas sur OnPropertyChanged
J'ai une zone de texte dont la Valeur est affectée à un ViewModel de la propriété:
<TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding Mode=TwoWay, Path=RunAfter}" Style="{StaticResource TestStepTextBox}"/>
L'ensemble et obtenir fonctionnent très bien jusqu'à ce que j'ai essayé d'ajouter un peu de validation lorsque la Valeur est définie:
private int _runAfter = 0;
public string RunAfter
{
get
{
return _runAfter.ToString();
}
set
{
int val = int.Parse(value);
if (_runAfter != val)
{
if (val < _order)
_runAfter = val;
else
{
_runAfter = 0;
OnPropertyChanged("RunAfter");
}
}
}
}
Bien que le OnPropertyChanged est atteint (j'ai dubugged qu'), la Vue n'est pas modifié.
Comment puis-je faire ce travail?
Grâce,
José Tavares
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous êtes la mise à jour de la source de la
Binding
tandis que leBinding
est la mise à jour de votre propriété. WPF ne sera pas réellement vérifier la valeur de votre propriété quand il soulève laPropertyChanged
de l'événement, en réponse à uneBinding
mise à jour. Vous pouvez résoudre ce problème en utilisant laDispatcher
de retarder la propagation de l'événement dans cette branche:Mise à jour:
L'autre chose que j'ai remarqué, c'est que le
Binding
sur votreTextBox
est à l'aide de la valeur par défautUpdateSourceTrigger
, ce qui arrive lorsque l'TextBox
perd le focus. Vous ne voyez pas le texte de revenir à 0 jusqu'à ce que après laTextBox
perd le focus avec ce mode. Si vous la changez pourPropertyChanged
, vous allez voir cela se produire immédiatement. Sinon, votre propriété ne sont pas get set jusqu'à ce que votreTextBox
perd le focus:Quelques choses que j'ai remarqué ici.
Sauf si vous avez une raison valable pour exposer le RunAfter propriété comme une chaîne de caractères, il n'y a aucune raison pourquoi il ne peut pas être un int. Que serait vous faire économiser de l'incantation dans l'incubateur (ainsi qu'un tapi possible InvalidCastException si l'utilisateur entre quelque chose de non-entier dans le domaine).
Deuxièmement, la OnPropertyChanged() l'appel doit se produire à l'extérieur de l'intérieur si la déclaration, comme suit:
Depuis le _runAfter local est mis à jour dans les deux chemins de la conditionnelle, la OnPropertyChanged() doit être appelé quelle que soit la direction prise. J'espère que ça aide de vous diriger dans la bonne direction!
J'ai eu la même situation. J'ai écrit la suite et cela a fonctionné.
<TextBox Grid.Column="3" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=FirstName}"></TextBox>
Et