/ / IDataErrorInfo valide avant la liaison - c #, wpf

IDataErrorInfo valider avant que la liaison ne se produise - c #, wpf

Je veux faire une simple validation de zone de texte dansWPF, mais je viens de me rendre compte que IDataErrorInfo repose sur la génération de l'événement PropertyChanged afin de déclencher la validation, ce qui signifie que la valeur non valide est appliquée à mon objet lié avant la validation. Existe-t-il un moyen de changer cela afin que la validation ait lieu en premier (et empêche la liaison sur des données non valides), ou existe-t-il une autre solution qui fonctionne de cette manière?

Le code ajusté ressemble à ceci:

<TextBox>
<TextBox.Text>
<Binding Path="MyProperty" ValidatesOnDataErrors="True" />
</TextBox.Text>
</TextBox>

public class MyViewModel : IDataErrorInfo
{
public string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged(() => MyProperty);
SaveSettings();
}
}
}

public string Error
{
get { return string.Empty; }
}

public string this[string columnName]
{
get
{
if (columnName == "MyProperty")
return "ERROR";
return string.Empty;
}
}
}

Réponses:

1 pour la réponse № 1

La meilleure interface et méthode de validation à utiliser (si vous utilisez .net 4.5) est INotifyDataErrorInfo. Son principal avantage est de vous permettre de contrôler quand et comment la validation se produit. Un bon aperçu:

http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation-asynchrone/


0 pour la réponse № 2

Je ne pense pas que vous deviez appeler SaveSettings ()méthode chaque fois que la propriété a changé. Je pense qu'il devrait être appelé lorsque l'utilisateur clique sur le bouton "Enregistrer", mais pas lorsque la propriété est modifiée. Toutefois, si vous souhaitez toujours enregistrer les modifications apportées aux propriétés modifiées, vous ne devez le faire que si aucune erreur de validation n'est disponible. Par exemple:

public class MyViewModel : IDataErrorInfo
{
public string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged(() => MyProperty);
if (string.IsNullOrEmpty(this["MyProperty"]))
{
SaveSettings();
}
}
}
}

public string Error
{
get { return string.Empty; }
}

public string this[string columnName]
{
get
{
if (columnName == "MyProperty")
return "ERROR";
return string.Empty;
}
}
}