Inline-editing TextBlock in eine ListBox mit Daten-Vorlage (WPF)
Verwendung von WPF, ich habe eine ListBox
Kontrolle mit einem DataTemplate
drin. Die entsprechenden XAML-code ist unten dargestellt:
<ListBox Name="_todoList" Grid.Row="1" BorderThickness="2"
Drop="todoList_Drop" AllowDrop="True"
HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
AlternationCount="2">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="4">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0" Checked="CheckBox_Check" />
<TextBlock Name="descriptionBlock"
Grid.Column="1"
Text="{Binding Description}"
Cursor="Hand" FontSize="14"
ToolTip="{Binding Description}"
MouseDown="TextBlock_MouseDown" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Was ich versuche zu tun ist, machen die TextBlock
reagieren auf eine (Doppel -) klicken Sie auf die wandelt es in eine TextBox
. Der Benutzer kann dann Bearbeiten Sie die Beschreibung, und drücken Sie die EINGABETASTE oder den Fokus ändern, um die änderung vorzunehmen.
Ich habe versucht, das hinzufügen einer TextBox
element in der gleichen position wie der TextBlock und seine Sichtbarkeit Collapsed
, aber ich weiß nicht, wie Sie navigieren, um die richtige TextBox
wenn der Benutzer geklickt hat, auf eine TextBlock
. Das heißt, ich weiß der Benutzer geklickt hat, auf eine bestimmte TextBlock
jetzt die TextBox
muss ich zeigen?
Jede Hilfe würde geschätzt werden, stark,
-Ko9
- Als tip, anstatt
pre
tags und explizit die Flucht Spitzen Klammern, können Sie einfach fügen Sie der XAML direkt in den editor, und verwenden Sie die 101010-Taste, um format als code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich getan habe in diesen Situationen verwendet wird, die XAML-Hierarchie zu bestimmen, welches element ein - /ausblenden. Etwas entlang der Linien von:
mit dem code:
Ich immer Sachen wie diese, die ich werde, um Wiederverwendung in einem
UserControl
, die ich hinzufügen können zusätzliche Fehlerbehandlung, und garantieren, dass dieGrid
enthält nur zwei Elemente, und die Reihenfolge von Ihnen wird sich nie ändern.EDIT: Außerdem, wenn dieses in einem Benutzersteuerelement können Sie erstellen eine
Text
Eigenschaft für jede Instanz, also können Sie den Namen jeder ein, und verweisen Sie auf den text direkt und ohne Angeln für den aktuellen Wert durch die((TextBox)myGrid.Children[1]).Text
Gießen. Dadurch wird Ihr code viel effizienter und sauberer. Wenn Sie es schaffen in ein Benutzersteuerelement erstellen, können Sie auch Namen für dieTextBlock
undTextBox
Elemente, also kein casting erforderlich.Beziehen sich auf die Nathan Wheeler ' s code snippets, die folgende codes sind komplette UserControl-Quelle, codiert ich gestern.
Vor allem, Verbindliche Themen angesprochen werden.
Nathan, der code ist einfach zu Folgen, muss aber einige Hilfe in Bezug auf die Arbeit mit datengebundenen text.
ClickToEditTextboxControl.xaml.cs
ClickToEditTextboxControl.xaml
Und, schließlich, Sie können verwenden Sie dieses Steuerelement in XAML wie folgt:
Beachten Sie, dass Mode=TwoWay, UpdateSourceTrigger=PropertyChanged eingestellt ist. Es ermöglicht das ändern der gebundenen Wert in jeder Art.
DataTemplate
für meineListBox
, aber der neue Wert wird nicht aktualisiert in der Quelle. DieItemsSource
ist der TypObservableCollection<string>
. Irgendwelche Ideen?Der ideale Weg, um dies zu tun wäre eine
ClickEditableTextBlock
- Steuerung, die standardmäßig rendert als ein TextBlock, sondern zeigt ein Textfeld wenn der Benutzer darauf klickt. Da eine gegebene ClickEditableTextBlock hat nur einen TextBlock und eine TextBox, Sie haben nicht das passende Problem. Dann verwenden Sie ein ClickEditableTextBlock anstatt einzelne Textblöcke und Textfelder in Ihren DataTemplate.Dies hat den Nebeneffekt, dass die Kapselung der Funktionalität in einer Kontrolle, so dass Sie nicht belasten Ihre Haupt-Fenster code-behind-mit der edit-Verhalten, plus können Sie ganz einfach wiederverwenden in anderen Vorlagen.
Wenn das klingt wie zu viel Mühe, können Sie Tag oder eine angefügte Eigenschaft zuordnen jeder TextBlock mit einer TextBox:
Beachten Sie die Verwendung von
{Binding ElementName=tb}
auf den Tag zu beziehen, um das Textfeld mit der Bezeichnungtb
.Und im code-behind:
(Um zu vermeiden die Verwendung der böse Tag-Eigenschaft, können Sie definieren eine benutzerdefinierte angefügte Eigenschaft tragen die TextBox binden, aber für die Kürze, ich bin mir nicht zeigen, dass.)
Wenn ich darf ergänzen, um die (Doppel -) Teil der ursprünglichen Frage, Youngjae ' s beantworten Sie die folgenden Ersatz in der xaml-Datei:
ersetzt mit
hinzufügen auch die richtige RoutedCommand im UserControl.Ressourcen
und ein CommandBinding im UserControl.CommandBindings
Auch in der code-behind-Datei:
wird ersetzt durch
Den Fall das einige Leute haben wollen Links doubleclick als input Geste, wie ich es Tat...