Liaison au double champ avec validation
Je suis en train de lier TextBox
à double
propriété d'un objet avec UpdateSourceTrigger=PropertyChanged
. L'objectif est immédiatement lors de l'édition de valider la valeur saisie pour être dans la plage autorisée (et affiche un message d'erreur si pas). Je veux mettre en œuvre la validation sur niveau du Modèle, c'est à dire via IDataErrorInfo
.
Tout fonctionne très bien quand je la lie à l'int de la propriété, mais si le bien est double puis une frustration comportement d'édition s'affiche: après l'effacement du dernier chiffre significatif dans la partie fractionnaire du nombre - le séparateur décimal est automatiquement effacé de toutes les fractions de zéros). Par exemple, après l'effacement du chiffre '3' nombre de '12.03' le texte est modifié en '12' au lieu de '12.0'.
S'il vous plaît, aider.
Voici un exemple de code:
MainWindow.xaml:
<Window x:Class="BindWithValidation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="80" Width="200" WindowStartupLocation="CenterOwner">
<StackPanel>
<TextBox Width="100" Margin="10" Text="{Binding DoubleField, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</StackPanel>
</Window>
MainWindow.xaml.cs:
namespace BindWithValidation
{
public partial class MainWindow : Window
{
private UISimpleData _uiData = new UISimpleData();
public MainWindow()
{
InitializeComponent();
DataContext = _uiData;
}
}
}
UISimpleData.cs:
namespace BindWithValidation
{
public class UISimpleData : INotifyPropertyChanged, IDataErrorInfo
{
private double _doubleField = 12.03;
public double DoubleField
{
get
{
return _doubleField;
}
set
{
if (_doubleField == value)
return;
_doubleField = value;
RaisePropertyChanged("DoubleField");
}
}
public string this[string propertyName]
{
get
{
string validationResult = null;
switch (propertyName)
{
case "DoubleField":
{
if (DoubleField < 2 || DoubleField > 5)
validationResult = "DoubleField is out of range";
break;
}
default:
throw new ApplicationException("Unknown Property being validated on UIData");
}
return validationResult;
}
}
public string Error { get { return "not implemented"; } }
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string property)
{
if ( PropertyChanged != null )
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
source d'informationauteur arudoy | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
Je me rends compte que je suis un peu en retard à la fête, mais j'ai trouvé (je pense) assez propre solution à ce problème.
Un intelligent convertisseur qui se souvient de la dernière chaîne convertie en double et les retours que, s'il existe, doit faire tout ce que vous voulez.
Noter que lorsque l'utilisateur modifie le contenu de la zone de texte, ConvertBack va stocker la chaîne de l'entrée de l'utilisateur, analyser la chaîne pour un double, et de transmettre cette valeur à la vue du modèle. Immédiatement après, Convertir est appelée pour afficher la nouvelle valeur. À ce stade, la chaîne stockée n'est pas nulle et sera retournée.
Si l'application à la place de l'utilisateur provoque le double de changer de Convertir est appelé. Cela signifie que la mise en cache de la chaîne sera nulle et un écart-ToString() sera appelée sur le double.
De cette façon, l'utilisateur évite d'étranges surprises lors de la modification du contenu de la zone de texte, mais l'application peut encore déclencher un changement.
(Sébastien Lux - Copié mot à mot de ici)
Essayé le formatage de la valeur décimale?
Il peut être bizarre, mais puisque vous sera alors toujours N décimales.
Si le fait d'avoir fixe de décimales n'est pas assez bon, vous pourriez avoir à écrire un convertisseur qui traite de la valeur sous forme de chaîne de caractères, et la convertit en arrière pour un double.
Le problème, c'est que vous êtes à la mise à jour de votre propriété chaque fois que la valeur change. Lorsque vous modifiez 12.03 à 12,0 il est arrondi à 12.
Vous pouvez voir les modifications en fournissant
delay
par la modification de laTextBox
dansxaml
comme cemais
delay
informera et définissez la propriété après le temps de retard en mili sec.Mieux utiliser
StringFormat
comme ceJ'ai couru dans le même problème, et nous avons trouvé un très solution la plus simple: utiliser un validateur personnalisé, qui ne renvoie pas "valide" lorsque le Texte se termine par "." ou "0":
Essayez d'utiliser StringFormat sur votre liaison:
Ne sais pas si la chaîne de format est encore droite depuis je n'ai pas fait l'un pour un certain temps, mais c'est juste un exemple