WPF: zone de texte Texte n'est pas mise à jour
J'ai un contrôle utilisateur que j'utilise à l'intérieur d'un DataTemplate
, ce UserControl
contient un TextBox
qui est lié avec Valeur propriété(déclaré comme un DependencyProperty
) de mon UserControl
. Dans le modèle de données-je lier cette Valeur bien avec ma réelle de la propriété dire Nom (également un DependencyProperty
). Il fonctionne correctement, je assigner une valeur à Nom de la propriété pendant le chargement et mon TextBox
l'affiche, je change la valeur de TextBox
et de la mise à jour de mon Nom bien aussi.
Maintenant, le problème vient alors que j'ai ajouter un PropertyChangedEventHandler
dans la propriété de dépendance, j'ai le contrôle de la valeur si elle est valide, ne rien faire si elle est valable et affecter l'ancienne valeur si pas valide. Dans le cas d'une valeur non valide, quand je l'affecter que l'ancienne valeur, la propriété des mises à jour mais il n'est pas de l'affichage de la valeur mise à jour dans mon TextBox
de UserControl
. Quelqu'un peut me dire pourquoi?
XAML de mon UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
Dans le code derrière Valeur est un DependencyProperty
J'utilise dans mon DataTemplate
:
<HierarchicalDataTemplate DataType="{x:Type myLib:myClass}" ItemsSource="{Binding Children}">
<Expander Header="{Binding}">
<WrapPanel>
<edproperty:TextPropertyEditor Caption="Name" Value="{Binding Name, Mode=TwoWay}"/>
<edproperty:TextPropertyEditor .................../>
<edproperty:TextPropertyEditor .................../>
<edproperty:TextPropertyEditor ...................../>
</WrapPanel>
</Expander>
</HierarchicalDataTemplate>
Ce modèle, je suis en utilisant dans un TreeView
. À l'intérieur de TreeView
je entrer une valeur dans le TextBox
qui met à jour les Valeur propriété de mon UserControl
, qui à son tour les mises à jour Nom propriété de myClass
je suis l'affectation d'un PropertyChangedCallback
à mon Nom Propriété dans myClass
, de l'exécution de certains de validation et de réaffecter le OldValue
si la validation échoue. À tour de rôle, des mises à jour Valeur bien aussi, mais je suis toujours de voir que le TextBox
a la même valeur que je suis entré plus tôt pas la mise à jour.
public string Name
{
get
{
return (string)GetValue(NameProperty);
}
set
{
SetValue(NameProperty, value);
}
}
//Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register("Name", typeof(string), typeof(myClass), new UIPropertyMetadata(null, OnNameChanged));
protected static void OnNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
if(checkRequired && !IsValid(e.NewValue.ToString()))
{
checkRequired=false;
(sender as myClass).Name = args.OldValue.ToString();
}
}
private static bool IsValid(string name)
{
.............some logic here
}
c'en est trop, il ne peut pas être affiché. Vous pouvez demander si vous voulez plus d'explications.
Non, vous pouvez écrire le code minimal morceau à reproduire... Sinon, nous serons deviner, pas de réponse. Personne n'aime l'incertitude. En particulier les programmeurs..
OriginalL'auteur viky | 2009-10-30
Vous devez vous connecter pour publier un commentaire.
Après des jours de recherche autour de et de beaucoup de recherche, j'ai trouvé la solution de mon problème
Après tout, validation et d'affectation de l'ancienne valeur et la mise à jour de la dépendance au bien, j'ai besoin de cal UpdateTarget() la méthode, pour mettre à Jour la valeur dans ma zone de texte.
C'est ce qui explique la meilleure solution
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/
OriginalL'auteur viky
Je sais que cette question a été sur zone de texte, mais pour RichTextBox vous utilisez UpdateLayout().
OriginalL'auteur mxgg250
Il semble que vous êtes en rupture de liaison lorsque vous définissez la valeur de la propriété directement à partir du code derrière.
Vous ne devriez pas modifier les propriétés de cette façon. Utilisation la valeur de la contrainte mécanisme et valider les entrées dans les Contraindre la valeur de rappel.
je vha mise à jour de ma question, u peut me suggérer quelque chose? désolé pour le retard
OriginalL'auteur Anvaka
Anurag,
Il y a beaucoup d'hypothèses que j'ai à faire ici, mais je vais donner un coup de feu.
Vous avez probablement quelque chose comme cela...
Ce n'est certainement pas la meilleure approche pour valider les données. Il existe d'autres méthodes plus efficientes qui vous donnera plus de flexibilité.
Ne pas utiliser DependecyPropertyChanged méthode de rappel. Utiliser un inscrit de la chaîne de Propriété et dans votre setter, appliquer la logique, par exemple
Une fois de plus, comme vous pouvez le voir dans ma réponse que vous pouvez toujours afficher le code dans votre question pour aider les autres à répondre à votre question, peu importe la complexité de votre solution peut-être (si vous voulez une bonne réponse, vous devez faire l'effort de poser une bonne question). Ma réponse peut ne pas fonctionner pour vous, mais peut-être que cela peut vous donner quelques "Googler" les directions. Espérons que cela aide.
La validation ajouté au chien d'arrêt dans votre exemple ne pas se produire lorsque WPF mises à jour de la propriété par le biais de la liaison ou un setter ou par le biais d'autres mécanismes. Il est recommandé de ne jamais mettre quelque chose dans votre accesseurs ou des mutateurs lors de l'utilisation des propriétés de dépendance.
OriginalL'auteur Tri Q Tran