WPF: TextBox-Text wird nicht aktualisiert
Ich habe ein Benutzersteuerelement, dass ich innerhalb einer DataTemplate
diese UserControl
enthält eine TextBox
die gebundenen mit Wert Eigenschaft(deklariert als DependencyProperty
) von meinem UserControl
. In der Daten-Vorlage, die ich binden diese Wert Eigenschaft, die mit meiner eigentlichen Eigenschaft sagen Namen (auch ein DependencyProperty
). Es funktioniert einwandfrei, ich habe einen Wert zuweisen Namen Eigenschaft beim laden und meine TextBox
zeigt Sie an, ich ändern Sie den Wert von TextBox
und aktualisiert es meine Namen Eigenschaft auch.
Jetzt das problem kommt, während ich einen PropertyChangedEventHandler
im Abhängigkeitseigenschaft, ich checke für Sie den Wert, wenn es gilt, nichts zu tun, wenn gültig und weisen alten Wert, wenn nicht gültig. Falls der Wert nicht gültig ist, wenn ich zuordnen, der alte Wert, Immobilien-updates, aber es ist nicht die Anzeige aktualisiert den Wert in meinem TextBox
von UserControl
. Kann mir jemand sagen warum?
XAML meiner UserControl
:
<UserControl x:Name="usercontrol">
<StackPanel>
<TextBlock ......./>
<TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/>
</StackPanel>
</UserControl>
In der code-behind - Wert ist ein DependencyProperty
Ich bin mit dieser in meinem 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>
Diese Vorlage verwende ich in einem TreeView
. Innerhalb TreeView
ich Wert eingeben in der TextBox
updates, die das Wert Eigentum meines UserControl
, dass wiederum updates Namen Eigenschaft von myClass
ich bin die Zuweisung einer PropertyChangedCallback
zu meinem Namen Eigenschaft in myClass
, Durchführung einer Validierung und die Neuzuweisung der OldValue
wenn die Validierung fehlschlägt. Sie wiederum updates Wert Eigenschaft auch, aber ich bin immer noch zu sehen, dass die TextBox
denselben Wert hat, den ich zuvor eingegeben haben, nicht aktualisiert.
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
}
- Ohne zu sehen, Ihren code, das wird schwierig, richtig zu kommentieren. Könnte Sie veröffentlichen Sie Ihren code bitte?
- es ist zu viel, es kann nicht gebucht werden. Sie können Fragen, wenn Sie mehr Erklärung.
- Nein, Sie können schreiben, minimaler code-Stück zu reproduzieren... Sonst werden wir raten, nicht zu beantworten. Niemand mag Unsicherheit. Besonders Programmierer..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Tagen der Suche und viel recherche fand ich die Lösung meines Problems
Nachdem alle überprüfung und Zuordnung alte Wert und die Aktualisierung der dependecy Eigenschaft, die ich brauche, um cal UpdateTarget () - Methode, um den Wert zu Aktualisieren in meiner TextBox.
Dies ist, was erklärt die Lösung besser
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/
Ich weiß, diese Frage wurde über die TextBox aber für das RichTextBox-Steuerelement, die Sie verwenden würden, UpdateLayout().
Wie es aussieht, brechen die Bindung, wenn Sie die set-Eigenschaft Wert, der direkt aus dem code hinter.
Sollte man nicht ändern, die Eigenschaft, dass Art und Weise. Verwenden Wert Zwang-Mechanismus und der überprüfung von Eingaben in der Nötigen Wert-Rückruf.
Anurag,
Gibt es eine Menge von Annahmen, die ich zu treffen hier, aber ich werde give it a shot.
Wahrscheinlich haben Sie so etwas wie dieses...
Dies ist definitiv nicht der beste Ansatz, um Daten zu validieren. Es gibt andere, effizientere Ansätze, die Ihnen mehr Flexibilität.
Nicht verwenden DependecyPropertyChanged callback-Methode. Verwenden Sie eine eingetragene Zeichenfolge-Eigenschaft und in Ihrem setter, Logik anwenden, z.B.
Wieder, wie Sie sehen können aus meiner Antwort, dass Sie noch zeigen-code in deiner Frage um anderen zu helfen, Ihre Frage zu beantworten, egal, wie Komplex Ihre Lösung sein kann (wenn du willst eine gute Antwort, die Sie brauchen, um in der Anstrengung zu bitten, eine gute Frage). Meine Antwort möglicherweise nicht für Sie arbeiten, aber vielleicht könnte es Ihnen einige "Googeln" weiter. Hoffe, es hilft.