Mit WPF habe ich eine ListBox
Kontrolle mit einem DataTemplate
darin. Der relevante XAML-Code wird unten angezeigt:
Was ich versuche zu tun, ist, dass TextBlock
auf einen (doppelten) Klick reagiert, wodurch es zu TextBox
wird. Der Benutzer kann dann die Beschreibung bearbeiten und auf Zurück oder Fokus drücken, um die Änderung vorzunehmen.
Ich habe versucht, ein TextBox
-Element an derselben Position wie der TextBlock hinzuzufügen und seine Sichtbarkeit Collapsed
zu machen, aber ich weiß nicht, wie ich zum rechten TextBox
navigieren soll, wenn der Benutzer auf% geklickt hat. Code%. Das heißt, ich weiß, dass der Benutzer auf ein bestimmtes TextBlock
geklickt hat, jetzt welches TextBlock
zeige ich?
Jede Hilfe wäre sehr willkommen,
-Ko9
Was ich in diesen Situationen getan habe, wird anhand der XAML-Hierarchie bestimmt, welches Element angezeigt / versteckt werden soll. Etwas in der Art von:
%Vor%mit dem Code:
%Vor% Ich mache immer Sachen wie diese, die ich in UserControl
wiederverwenden werde, denen ich eine zusätzliche Fehlerbehandlung hinzufügen kann, und garantiere, dass Grid
nur zwei Elemente enthält, und deren Reihenfolge niemals ändern.
BEARBEITEN: Wenn Sie dies in ein UserControl umwandeln, können Sie für jede Instanz eine Text
-Eigenschaft erstellen, so dass Sie jede benennen und direkt auf den Text verweisen können, ohne nach dem aktuellen Wert durch das ((TextBox)myGrid.Children[1]).Text
Casting zu suchen. Dadurch wird Ihr Code viel effizienter und sauberer. Wenn Sie es zu einem Benutzersteuerelement machen, können Sie auch die Elemente TextBlock
und TextBox
benennen, sodass überhaupt keine Umwandlung erforderlich ist.
Sehen Sie sich das Code-Snippet von Nathan Wheeler an, die folgenden Codes sind eine komplette UserControl-Quelle, die ich gestern codiert habe. Insbesondere werden Bindungsprobleme behoben. Nathans Code ist leicht zu verstehen, benötigt aber Hilfe, um mit datengebundenem Text zu arbeiten.
ClickToEditTextboxControl.xaml.cs
%Vor%ClickToEditTextboxControl.xaml
%Vor%Und schließlich können Sie dieses Steuerelement in der XAML wie folgt verwenden:
%Vor%Beachten Sie, dass Modus = TwoWay, UpdateSourceTrigger = PropertyChanged festgelegt ist. Es ermöglicht den binded Wert in jedem Typ zu ändern.
Der ideale Weg wäre, ein ClickEditableTextBlock
-Steuerelement zu erstellen, das standardmäßig als TextBlock dargestellt wird, aber ein Textfeld anzeigt, wenn der Benutzer darauf klickt. Da jeder gegebene ClickEditableTextBlock nur einen TextBlock und ein TextBox hat, haben Sie nicht das passende Problem. Dann verwenden Sie einen ClickEditableTextBlock anstelle von separaten TextBlocks und TextBoxen in Ihrem DataTemplate.
Dies hat den Nebeneffekt, dass die Funktionalität in einem Steuerelement eingekapselt wird, so dass Sie den Hauptfenstercode nicht mit dem Bearbeitungsverhalten verschmutzen, und Sie können ihn problemlos in anderen Vorlagen wiederverwenden.
Wenn das zu mühsam klingt, können Sie mit Tag oder einer angefügten Eigenschaft jedem TextBlock eine TextBox zuordnen:
%Vor% Beachten Sie die Verwendung von {Binding ElementName=tb}
auf dem Tag, um auf das Textfeld tb
zu verweisen.
Und in deinem Code-Behind:
%Vor%(Um die Verwendung der unangenehmen Tag-Eigenschaft zu vermeiden, könnten Sie eine benutzerdefinierte angefügte Eigenschaft definieren, um die TextBox-Bindung zu übernehmen, aber aus Gründen der Kürze zeige ich das nicht.)
Tags und Links wpf c# listbox xaml datatemplate