Wie alle den Text auszuwählen, wenn die Textbox bearbeiten in einem Datagridtemplatecolumn Fokus erhält?

StackOverflow https://stackoverflow.com/questions/2640327

Frage

Ich versuche, einen Datagridtemplatecolumn zu bekommen identisch mit einem Textcolumn

verhalten
  • , wenn die Zelle geht in den Bearbeitungsmodus (Press F2), kann der Benutzer sofort die Eingabe in den neuen Wert starten
  • standardmäßig vorhandene Textinhalt gewählt wird - so dass man leicht neue Werte einstellen

Haben Sie die ersten getan; aber die Auswahl der gesamte Text nicht funktioniert. Wie von einer Reihe von Stellen erwähnt, versucht in das GotFocus-Ereignis Einhaken und den gesamten Text in Code-Behind-Auswahl. Das funktionierte für eine eigenständige Textbox; jedoch für eine Textbox, die die Bearbeitungssteuerung für ein Template ist, das nicht funktioniert.

Irgendwelche Ideen? Code-Beispiel:

<Window.Resources>
            <Style x:Key="HighlightTextBoxStyle" TargetType="{x:Type TextBox}">
                <EventSetter Event="GotFocus" Handler="SelectAllText"/>
                <EventSetter Event="GotMouseCapture" Handler="SelectAllText"/>
                <Setter Property="Background" Value="AliceBlue"/>
            </Style>

            <DataTemplate x:Key="DefaultTitleTemplate">
                <TextBlock Text="{Binding Title}"/>
            </DataTemplate>
            <DataTemplate x:Key="EditTitleTemplate">
                    <TextBox x:Name="Fox"
                         FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"  
                         Text="{Binding Path=Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                         Style="{StaticResource HighlightTextBoxStyle}">
                    </TextBox>
            </DataTemplate>
        </Window.Resources>
        <DockPanel>
            <TextBox DockPanel.Dock="Top" x:Name="Test" Text="{Binding Path=(FocusManager.FocusedElement).Name, ElementName=MyWindow}" 
                     Style="{StaticResource HighlightTextBoxStyle}"/>
            <toolkit:DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
                <toolkit:DataGrid.Columns>
                    <toolkit:DataGridTemplateColumn Header="Templated Title" 
                        CellTemplate="{StaticResource DefaultTitleTemplate}"
                        CellEditingTemplate="{StaticResource EditTitleTemplate}" />

                    <toolkit:DataGridTextColumn Header="Title" Binding="{Binding Path=Title}" />
                </toolkit:DataGrid.Columns>
            </toolkit:DataGrid>
        </DockPanel>
War es hilfreich?

Lösung

Verpasste die Post mit einer Antwort zu aktualisieren ...

Das Problem scheint, dass für eine benutzerdefinierte Datenrasterspalte zu sein (auch bekannt als einen Datagridtemplatecolumn) das Gitter hat keine Möglichkeit, die genaue Art der Bearbeitung Steuerung des Wissens (die über eine Datatemplate angegeben ist und alles sein könnte). Für eine Datagridtextcolumn wird die Bearbeitung Steuerungstyp bekannt und daher kann das Gitter finden und aufrufen, um eine SelectAll () drin.

So das End-Ziel für einen Template zu erreichen, müssen Sie einen Assist zur Verfügung zu stellen. Ich vergessen, wie ich es beim ersten Mal gelöst .. aber hier ist etwas, dass ich heute Visitation gezwickt aus. Erstellen Sie eine benutzerdefinierte Ableitung eines Template mit einer Überschreibung der PrepareCellForEdit Methode wie unten (Swap Textbox mit Ihrem genauen Editiersteuerabschnitt) gezeigt.

public class MyCustomDataColumn : DataGridTemplateColumn
    {
        protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
        {
            var contentPresenter = editingElement as ContentPresenter;

            var editingControl = FindVisualChild<TextBox>(contentPresenter);
            if (editingControl == null)
                return null;

            editingControl.SelectAll();
            return null;
        }

        private static childItem FindVisualChild<childItem>(DependencyObject obj) 
    }

Hier eine Implementierung für FindVisualChild .

XAML:

   <WPFTestBed:MyCustomDataColumn Header="CustomColumn"
                    CellTemplate="{StaticResource DefaultTitleTemplate}"
                    CellEditingTemplate="{StaticResource EditTitleTemplate}"/>
</DataGrid.Columns>

Lot von Code für eine lästige Inkonsistenz.

Andere Tipps

Ich weiß, so spät ist, aber ich habe einen anderen Ansatz und kreativ die TextBox-Klasse erweitert. Ich weiß nicht wirklich wie die boolean Verwendung zu prüfen, ob der Text bereits definiert ist, aber das Problem ist, dass die Auswahlereignisse alle Feuer vor dem Text aus der Bindung so SelectAll gesetzt () haben nichts zu wählen! Diese Klasse ist wahrscheinlich nur als Bearbeitungsvorlage in so etwas wie ein Datagridtemplatecolumn nützlich. Jede Lösung, die ich für dieses Problem gefunden ist so ziemlich ein Hack, damit ich über diese ein Gefühl, auch nicht schlecht ...:)

class AutoSelectTextBox : TextBox
{
    private bool _autoSelectAll= true;

    protected override void OnInitialized(EventArgs e)
    {
        // This will cause the cursor to enter the text box ready to
        // type even when there is no content.
        Focus();
        base.OnInitialized(e);
    }

    protected override OnKeyDown(System.Windows.Input.KeyEventArgs e)
    {
        // This is here to handle the case of an empty text box.  If
        // omitted then the first character would be auto selected when
        // the user starts typing.
        _autoSelectAll = false;
        base.OnKeyDown(e);
    }


    protected override void OnTextChanged(TextChangedEventArgs e)
    {
        if (_autoSelectAll)
        {
            SelectAll();
            Focus();
            _autoSelectAll= false;
        }
        base.OnTextChanged(e);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top