Inline-Bearbeitung von TextBlock in einer ListBox mit Datenvorlage (WPF)

8

Mit WPF habe ich eine ListBox Kontrolle mit einem DataTemplate darin. Der relevante XAML-Code wird unten angezeigt:

%Vor%

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

    
Ko9 18.01.2010, 20:18
quelle

3 Antworten

14

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.

    
Nathan Wheeler 18.01.2010, 20:38
quelle
11

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.

    
Youngjae 30.01.2017 23:47
quelle
4

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.)

    
itowlson 18.01.2010 20:35
quelle

Tags und Links