Ich möchte, dass der Benutzer die Zelle in den Bearbeitungsmodus versetzen und die Zeile, in der sich die Zelle befindet, mit einem einzigen Klick markieren kann. Standardmäßig ist dies ein Doppelklick.
Dieses DataGrid ist an eine CollectionViewSource (mit Dummy- Personenobjekten ) gebunden .
Dort passiert die Magie: DataGridCell.Selected = "DataGridCell_Selected" .
Ich hänge einfach das ausgewählte Ereignis der DataGrid-Zelle ein und rufe BeginEdit () im DataGrid auf.
Hier ist der Code für den Event-Handler:
privatevoidDataGridCell_Selected(object sender,RoutedEventArgs e){// Lookup for the source to be DataGridCellif(e.OriginalSource.GetType()==typeof(DataGridCell)){// Starts the Edit on the row;DataGrid grd =(DataGrid)sender;
grd.BeginEdit(e);}}
Sie können das bereits ausgewählte SelectionUnitZeilenproblem umgehen, indem Sie die Eigenschaft im DataGrid auf festlegen Cell.
Matt Winckler
Angenommen, ich habe eine Textbox in meiner DataGridCell. Nachdem ich angerufen habe grd.BeginEdit(e), möchte ich, dass die TextBox in dieser Zelle den Fokus hat. Wie kann ich das machen? Ich habe versucht, FindName("txtBox")sowohl DataGridCell als auch DataGrid aufzurufen, aber es gibt für mich null zurück.
user1214135
GotFocus = "DataGrid_GotFocus" scheint zu fehlen?
Synergie
4
Das funktioniert gut, aber ich würde nicht empfehlen, dies zu tun. Ich habe dies in meinem Projekt verwendet und beschlossen, auf das Standard-DG-Verhalten zurückzugreifen. Wenn Ihre GD in Zukunft wächst und komplex wird, treten Probleme mit der Validierung, dem Hinzufügen neuer Zeilen und anderen seltsamen Verhaltensweisen auf.
white.zaz
1
@ white.zaz war der Kunde zufrieden, nachdem Sie das Standard-DG-Verhalten rückgängig gemacht haben? Der Hauptgrund für diese Frage war, dass das Bearbeiten in Standard-DG-Funktionen nicht benutzerfreundlich ist, da es zu oft angeklickt werden muss, bevor DG in den Bearbeitungsmodus wechselt.
AEMLoviji
42
Die Antwort von Micael Bergeron war ein guter Anfang für mich, um eine Lösung zu finden, die für mich funktioniert. Um die Bearbeitung mit einem Klick auch für Zellen in derselben Zeile zu ermöglichen, die sich bereits im Bearbeitungsmodus befindet, musste ich sie etwas anpassen. Die Verwendung von SelectionUnit Cell war für mich keine Option.
Anstatt das DataGridCell.Selected-Ereignis zu verwenden, das nur zum ersten Mal ausgelöst wird, wenn auf die Zelle einer Zeile geklickt wird, habe ich das DataGridCell.GotFocus-Ereignis verwendet.
Wenn Sie dies tun, haben Sie immer die richtige Zelle fokussiert und im Bearbeitungsmodus, aber es wird keine Steuerung in der Zelle fokussiert. Dies habe ich so gelöst
privatevoidDataGrid_CellGotFocus(object sender,RoutedEventArgs e){// Lookup for the source to be DataGridCellif(e.OriginalSource.GetType()==typeof(DataGridCell)){// Starts the Edit on the row;DataGrid grd =(DataGrid)sender;
grd.BeginEdit(e);Control control =GetFirstChildByType<Control>(e.OriginalSourceasDataGridCell);if(control !=null){
control.Focus();}}}private T GetFirstChildByType<T>(DependencyObject prop)where T :DependencyObject{for(int i =0; i <VisualTreeHelper.GetChildrenCount(prop); i++){DependencyObject child =VisualTreeHelper.GetChild((prop), i)asDependencyObject;if(child ==null)continue;
T castedProp = child as T;if(castedProp !=null)return castedProp;
castedProp =GetFirstChildByType<T>(child);if(castedProp !=null)return castedProp;}returnnull;}
Dies funktioniert in bestimmten Fällen nicht und ist komplizierter als die Lösung von Micael Bergerons.
SwissCoder
Für mich war das fast die Lösung. Ich musste einen "PreviewMouseLeftButtonUp" -Ereignishandler hinzufügen und dort genau den gleichen Code einfügen.
Néstor Sánchez A.
Dies funktioniert auch nicht, wenn Sie eine Combobox haben. Beim Klicken auf die Vorschau werden Klicks auf das Popup der Combobox angezeigt, und der Aufruf von cell.focus bringt alles durcheinander. Am einfachsten ist es, einen Abschnitt hinzuzufügen, in dem die ursprüngliche Quelle der Mausereignisse angezeigt wird. Verwenden Sie dazu FindVisualParent, um festzustellen, ob sie sich im Datagrid befindet. Wenn nicht, machen Sie keine der anderen Arbeiten.
John Gardner
7
Die Lösung von http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing hat bei mir hervorragend funktioniert, aber ich habe sie für jedes DataGrid mithilfe eines in einem ResourceDictionary definierten Stils aktiviert. Um Handler in Ressourcenwörterbüchern zu verwenden, müssen Sie eine CodeBehind-Datei hinzufügen. So geht's:
Dies ist ein DataGridStyles.xaml- Ressourcenwörterbuch:
<ResourceDictionaryx:Class="YourNamespace.DataGridStyles"x:ClassModifier="public"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><StyleTargetType="DataGrid"><!-- Your DataGrid style definition goes here --><!-- Cell style --><Setter Property="CellStyle"><Setter.Value><Style TargetType="DataGridCell"><!-- Your DataGrid Cell style definition goes here --><!-- Single Click Editing --><EventSetter Event="PreviewMouseLeftButtonDown"
Handler="DataGridCell_PreviewMouseLeftButtonDown"/></Style></Setter.Value></Setter></Style></ResourceDictionary>
Beachten Sie das Attribut x: Class im Stammelement. Erstellen Sie eine Klassendatei. In diesem Beispiel wäre es DataGridStyles.xaml.cs . Geben Sie diesen Code ein:
usingSystem.Windows.Controls;usingSystem.Windows;usingSystem.Windows.Input;namespaceYourNamespace{partialclassDataGridStyles:ResourceDictionary{publicDataGridStyles(){InitializeComponent();}// The code from the myermian's answer goes here.}
Dies funktioniert nicht, wenn eine Combobox als Bearbeitungsvorlage verwendet wird. Ich würde davon ausgehen, dass andere wie das Kontrollkästchen, mit dem Mausereignisse erfasst werden, ebenfalls
Steve,
Für mich funktioniert dies mit Combobox-Spalten, aber das Textfeld der "neuen Elementzeile" (letzte Zeile) hat ein seltsames Verhalten: Beim ersten Klicken erhalte ich den Eingabefokus und kann Dinge eingeben. Wenn ich die Maus aus der Zelle bewege Der Wert des Textfelds verschwindet. Bei weiterer Eingabe wird der neu eingegebene Text korrekt gespeichert (es wird wie gewünscht ein neuer Eintrag erstellt). Dies tritt auch bei einer ComboboxColumn auf.
FrankM
Anfangs scheint es gut zu funktionieren, aber mein Datagrid ist total durcheinander. Wenn ich versuche zu sortieren, verschwinden alle diese Werte. Ohne diesen Code funktioniert alles gut mit dem Sortieren.
Chandraprakash
3
Ich habe es gelöst, indem ich einen Trigger hinzugefügt habe, der die IsEditing-Eigenschaft der DataGridCell auf True setzt, wenn sich die Maus darüber befindet. Es hat die meisten meiner Probleme gelöst. Es funktioniert auch mit Comboboxen.
Funktioniert nicht ... es verliert die Bearbeitung, sobald die Maus die Zelle verlässt. Sie klicken also 1) mit der linken Maustaste auf die Zelle, die Sie bearbeiten möchten. 2) Bewegen Sie die Maus aus dem Weg. 3) Beginnen Sie mit der Eingabe. Ihre Eingabe funktioniert nicht, da sich die Zelle nicht mehr im Bearbeitungsmodus befindet.
Skarsnik
1
funktioniert auch nicht für mich. verhindert das Bearbeiten von Textfeldern für mich
Blechdose
Aber es gibt ein Problem mit diesem Ansatz, ich hatte die 1. Spalte für die Bearbeitung gesperrt, mit diesem Ansatz macht dies die 1. Spalte auch bearbeitbar!
Chandraprakash
3
Ich suche nach einer Bearbeitungszelle mit einem Klick in MVVM und dies ist eine andere Möglichkeit, dies zu tun.
Es gibt zwei Probleme mit der Antwort von user2134678. Einer ist sehr gering und hat keine funktionelle Wirkung. Der andere ist ziemlich bedeutsam.
Das erste Problem ist, dass der GotFocus tatsächlich gegen das DataGrid aufgerufen wird, in der Praxis nicht gegen das DataGridCell. Das DataGridCell-Qualifikationsmerkmal in der XAML ist redundant.
Das Hauptproblem, das ich bei der Antwort festgestellt habe, ist, dass das Verhalten der Eingabetaste fehlerhaft ist. Die Eingabetaste sollte Sie im normalen DataGrid-Verhalten zur nächsten Zelle unterhalb der aktuellen Zelle bewegen. Was jedoch tatsächlich hinter den Kulissen passiert, ist, dass das GotFocus-Ereignis zweimal aufgerufen wird. Einmal, wenn die aktuelle Zelle den Fokus verliert und einmal, wenn die neue Zelle den Fokus gewinnt. Solange BeginEdit für diese erste Zelle aufgerufen wird, wird die nächste Zelle niemals aktiviert. Das Ergebnis ist, dass Sie mit einem Klick bearbeiten können, aber jeder, der nicht buchstäblich auf das Raster klickt, wird belästigt, und ein Benutzeroberflächendesigner sollte nicht davon ausgehen, dass alle Benutzer Mäuse verwenden. (Tastaturbenutzer können dies mithilfe von Tab umgehen, aber das bedeutet immer noch, dass sie durch Reifen springen, die sie nicht benötigen sollten.)
Also die Lösung für dieses Problem? Behandeln Sie das Ereignis KeyDown für die Zelle. Wenn der Schlüssel die Eingabetaste ist, setzen Sie ein Flag, das verhindert, dass BeginEdit in der ersten Zelle ausgelöst wird. Jetzt verhält sich die Eingabetaste wie es sollte.
Fügen Sie Ihrem DataGrid zunächst den folgenden Stil hinzu:
Wenden Sie diesen Stil auf die Eigenschaft "CellStyle" der Spalten an, für die Sie einen Klick aktivieren möchten.
Dann haben Sie im Code dahinter Folgendes in Ihrem GotFocus-Handler (beachten Sie, dass ich hier VB verwende, weil dies unser "One-Click-Data-Grid-Requesting" -Client als Entwicklungssprache wollte):
Anschließend fügen Sie Ihren Handler für das KeyDown-Ereignis hinzu:
PrivateSubDataGridCell_KeyDown(ByVal sender AsObject,ByVal e AsKeyEventArgs)If e.Key=Key.EnterThenMe._endEditing =TrueEndIfEndSub
Jetzt haben Sie ein DataGrid, das kein grundlegendes Verhalten der sofort einsatzbereiten Implementierung geändert hat und dennoch die Bearbeitung mit nur einem Klick unterstützt.
Ich weiß, dass ich etwas spät zur Party komme, aber ich hatte das gleiche Problem und fand eine andere Lösung:
publicclassDataGridTextBoxColumn:DataGridBoundColumn{publicDataGridTextBoxColumn():base(){}protectedoverrideFrameworkElementGenerateEditingElement(DataGridCell cell,object dataItem){thrownewNotImplementedException("Should not be used.");}protectedoverrideFrameworkElementGenerateElement(DataGridCell cell,object dataItem){var control =newTextBox();
control.Style=(Style)Application.Current.TryFindResource("textBoxStyle");
control.FontSize=14;
control.VerticalContentAlignment=VerticalAlignment.Center;BindingOperations.SetBinding(control,TextBox.TextProperty,Binding);
control.IsReadOnly=IsReadOnly;return control;}}<DataGridGrid.Row="1" x:Name="exportData"Margin="15"VerticalAlignment="Stretch"ItemsSource="{Binding CSVExportData}"Style="{StaticResource dataGridStyle}"><DataGrid.Columns><local:DataGridTextBoxColumnHeader="Sample ID"Binding="{Binding SampleID}"IsReadOnly="True"></local:DataGridTextBoxColumn><local:DataGridTextBoxColumnHeader="Analysis Date"Binding="{Binding Date}"IsReadOnly="True"></local:DataGridTextBoxColumn><local:DataGridTextBoxColumnHeader="Test"Binding="{Binding Test}"IsReadOnly="True"></local:DataGridTextBoxColumn><local:DataGridTextBoxColumnHeader="Comment"Binding="{Binding Comment}"></local:DataGridTextBoxColumn></DataGrid.Columns></DataGrid>
Wie Sie sehen, habe ich meine eigene DataGridTextColumn geschrieben, die alles von der DataGridBoundColumn erbt. Durch Überschreiben der GenerateElement-Methode und Zurückgeben eines Textbox-Steuerelements wird die Methode zum Generieren des Bearbeitungselements niemals aufgerufen. In einem anderen Projekt habe ich damit eine Datepicker-Spalte implementiert, sodass dies auch für Kontrollkästchen und Comboboxen funktionieren sollte.
Dies scheint keinen Einfluss auf das restliche Verhalten der Datagrids zu haben. Zumindest habe ich bisher keine Nebenwirkungen bemerkt und auch keine negativen Rückmeldungen erhalten.
Eine einfache Lösung, wenn Sie damit einverstanden sind, dass Ihre Zelle ein Textfeld bleibt (keine Unterscheidung zwischen Bearbeitungsmodus und Nichtbearbeitungsmodus). Auf diese Weise funktioniert die Bearbeitung mit einem Klick sofort. Dies funktioniert auch mit anderen Elementen wie Combobox und Schaltflächen. Verwenden Sie andernfalls die Lösung unter dem Update.
Ich habe alles ausprobiert, was ich hier und bei Google gefunden habe, und sogar versucht, meine eigenen Versionen zu erstellen. Aber jede Antwort / Lösung funktionierte hauptsächlich für Textfeldspalten, funktionierte jedoch nicht mit allen anderen Elementen (Kontrollkästchen, Kombinationsfelder, Schaltflächenspalten) oder brach sogar diese anderen Elementspalten oder hatte andere Nebenwirkungen. Vielen Dank an Microsoft, dass Datagrid sich so hässlich verhält und uns zwingt, diese Hacks zu erstellen. Aus diesem Grund habe ich beschlossen, eine Version zu erstellen, die mit einem Stil direkt auf eine Textfeldspalte angewendet werden kann, ohne andere Spalten zu beeinflussen.
Eigenschaften
Kein Code dahinter. MVVM freundlich.
Dies funktioniert, wenn Sie auf verschiedene Textfeldzellen in derselben oder in verschiedenen Zeilen klicken.
Fügen Sie diesen Stil hinzu. Das BasedOnist wichtig , wenn Sie ein paar verwenden ausgefallene Styles für Ihre Datagrid und Sie nicht sie wollen zu verlieren.
Fügen Sie diese Klasse jetzt demselben Namespace wie Ihrem MainViewModel hinzu (oder einem anderen Namespace. Dann müssen Sie jedoch ein anderes Namespace-Präfix als verwenden local). Willkommen in der hässlichen Code-Welt der angehängten Verhaltensweisen.
usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Media;namespaceYourMainViewModelNameSpace{publicstaticclassDataGridTextBoxSingleClickEditBehavior{publicstaticreadonlyDependencyPropertyEnableProperty=DependencyProperty.RegisterAttached("Enable",typeof(bool),typeof(DataGridTextBoxSingleClickEditBehavior),newFrameworkPropertyMetadata(false,OnEnableChanged));publicstaticboolGetEnable(FrameworkElement frameworkElement){return(bool) frameworkElement.GetValue(EnableProperty);}publicstaticvoidSetEnable(FrameworkElement frameworkElement,boolvalue){
frameworkElement.SetValue(EnableProperty,value);}privatestaticvoidOnEnableChanged(DependencyObject d,DependencyPropertyChangedEventArgs e){if(d isDataGridCell dataGridCell)
dataGridCell.PreviewMouseLeftButtonDown+=DataGridCell_PreviewMouseLeftButtonDown;}privatestaticvoidDataGridCell_PreviewMouseLeftButtonDown(object sender,System.Windows.Input.MouseButtonEventArgs e){EditCell(sender asDataGridCell, e);}privatestaticvoidEditCell(DataGridCell dataGridCell,RoutedEventArgs e){if(dataGridCell ==null|| dataGridCell.IsEditing|| dataGridCell.IsReadOnly)return;if(dataGridCell.IsFocused==false)
dataGridCell.Focus();var dataGrid =FindVisualParent<DataGrid>(dataGridCell);
dataGrid?.BeginEdit(e);}privatestatic T FindVisualParent<T>(UIElement element)where T :UIElement{var parent =VisualTreeHelper.GetParent(element)asUIElement;while(parent !=null){if(parent is T parentWithCorrectType)return parentWithCorrectType;
parent =VisualTreeHelper.GetParent(parent)asUIElement;}returnnull;}}}
Antworten:
So habe ich dieses Problem behoben:
Dieses DataGrid ist an eine CollectionViewSource (mit Dummy- Personenobjekten ) gebunden .
Dort passiert die Magie: DataGridCell.Selected = "DataGridCell_Selected" .
Ich hänge einfach das ausgewählte Ereignis der DataGrid-Zelle ein und rufe BeginEdit () im DataGrid auf.
Hier ist der Code für den Event-Handler:
quelle
SelectionUnit
Zeilenproblem umgehen, indem Sie die Eigenschaft im DataGrid auf festlegenCell
.grd.BeginEdit(e)
, möchte ich, dass die TextBox in dieser Zelle den Fokus hat. Wie kann ich das machen? Ich habe versucht,FindName("txtBox")
sowohl DataGridCell als auch DataGrid aufzurufen, aber es gibt für mich null zurück.Die Antwort von Micael Bergeron war ein guter Anfang für mich, um eine Lösung zu finden, die für mich funktioniert. Um die Bearbeitung mit einem Klick auch für Zellen in derselben Zeile zu ermöglichen, die sich bereits im Bearbeitungsmodus befindet, musste ich sie etwas anpassen. Die Verwendung von SelectionUnit Cell war für mich keine Option.
Anstatt das DataGridCell.Selected-Ereignis zu verwenden, das nur zum ersten Mal ausgelöst wird, wenn auf die Zelle einer Zeile geklickt wird, habe ich das DataGridCell.GotFocus-Ereignis verwendet.
Wenn Sie dies tun, haben Sie immer die richtige Zelle fokussiert und im Bearbeitungsmodus, aber es wird keine Steuerung in der Zelle fokussiert. Dies habe ich so gelöst
quelle
Von: http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing
XAML:
CODE-HINTER:
quelle
Die Lösung von http://wpf.codeplex.com/wikipage?title=Single-Click%20Editing hat bei mir hervorragend funktioniert, aber ich habe sie für jedes DataGrid mithilfe eines in einem ResourceDictionary definierten Stils aktiviert. Um Handler in Ressourcenwörterbüchern zu verwenden, müssen Sie eine CodeBehind-Datei hinzufügen. So geht's:
Dies ist ein DataGridStyles.xaml- Ressourcenwörterbuch:
Beachten Sie das Attribut x: Class im Stammelement. Erstellen Sie eine Klassendatei. In diesem Beispiel wäre es DataGridStyles.xaml.cs . Geben Sie diesen Code ein:
quelle
Ich bevorzuge diesen Weg basierend auf dem Vorschlag von Dušan Knežević. du klickst auf das war's))
quelle
Ich habe es gelöst, indem ich einen Trigger hinzugefügt habe, der die IsEditing-Eigenschaft der DataGridCell auf True setzt, wenn sich die Maus darüber befindet. Es hat die meisten meiner Probleme gelöst. Es funktioniert auch mit Comboboxen.
quelle
Ich suche nach einer Bearbeitungszelle mit einem Klick in MVVM und dies ist eine andere Möglichkeit, dies zu tun.
Verhalten in xaml hinzufügen
Die EditCellOnSingleClickBehavior-Klasse erweitert System.Windows.Interactivity.Behavior.
Voila!
quelle
Es gibt zwei Probleme mit der Antwort von user2134678. Einer ist sehr gering und hat keine funktionelle Wirkung. Der andere ist ziemlich bedeutsam.
Das erste Problem ist, dass der GotFocus tatsächlich gegen das DataGrid aufgerufen wird, in der Praxis nicht gegen das DataGridCell. Das DataGridCell-Qualifikationsmerkmal in der XAML ist redundant.
Das Hauptproblem, das ich bei der Antwort festgestellt habe, ist, dass das Verhalten der Eingabetaste fehlerhaft ist. Die Eingabetaste sollte Sie im normalen DataGrid-Verhalten zur nächsten Zelle unterhalb der aktuellen Zelle bewegen. Was jedoch tatsächlich hinter den Kulissen passiert, ist, dass das GotFocus-Ereignis zweimal aufgerufen wird. Einmal, wenn die aktuelle Zelle den Fokus verliert und einmal, wenn die neue Zelle den Fokus gewinnt. Solange BeginEdit für diese erste Zelle aufgerufen wird, wird die nächste Zelle niemals aktiviert. Das Ergebnis ist, dass Sie mit einem Klick bearbeiten können, aber jeder, der nicht buchstäblich auf das Raster klickt, wird belästigt, und ein Benutzeroberflächendesigner sollte nicht davon ausgehen, dass alle Benutzer Mäuse verwenden. (Tastaturbenutzer können dies mithilfe von Tab umgehen, aber das bedeutet immer noch, dass sie durch Reifen springen, die sie nicht benötigen sollten.)
Also die Lösung für dieses Problem? Behandeln Sie das Ereignis KeyDown für die Zelle. Wenn der Schlüssel die Eingabetaste ist, setzen Sie ein Flag, das verhindert, dass BeginEdit in der ersten Zelle ausgelöst wird. Jetzt verhält sich die Eingabetaste wie es sollte.
Fügen Sie Ihrem DataGrid zunächst den folgenden Stil hinzu:
Wenden Sie diesen Stil auf die Eigenschaft "CellStyle" der Spalten an, für die Sie einen Klick aktivieren möchten.
Dann haben Sie im Code dahinter Folgendes in Ihrem GotFocus-Handler (beachten Sie, dass ich hier VB verwende, weil dies unser "One-Click-Data-Grid-Requesting" -Client als Entwicklungssprache wollte):
Anschließend fügen Sie Ihren Handler für das KeyDown-Ereignis hinzu:
Jetzt haben Sie ein DataGrid, das kein grundlegendes Verhalten der sofort einsatzbereiten Implementierung geändert hat und dennoch die Bearbeitung mit nur einem Klick unterstützt.
quelle
Ich weiß, dass ich etwas spät zur Party komme, aber ich hatte das gleiche Problem und fand eine andere Lösung:
Wie Sie sehen, habe ich meine eigene DataGridTextColumn geschrieben, die alles von der DataGridBoundColumn erbt. Durch Überschreiben der GenerateElement-Methode und Zurückgeben eines Textbox-Steuerelements wird die Methode zum Generieren des Bearbeitungselements niemals aufgerufen. In einem anderen Projekt habe ich damit eine Datepicker-Spalte implementiert, sodass dies auch für Kontrollkästchen und Comboboxen funktionieren sollte.
Dies scheint keinen Einfluss auf das restliche Verhalten der Datagrids zu haben. Zumindest habe ich bisher keine Nebenwirkungen bemerkt und auch keine negativen Rückmeldungen erhalten.
quelle
Aktualisieren
Eine einfache Lösung, wenn Sie damit einverstanden sind, dass Ihre Zelle ein Textfeld bleibt (keine Unterscheidung zwischen Bearbeitungsmodus und Nichtbearbeitungsmodus). Auf diese Weise funktioniert die Bearbeitung mit einem Klick sofort. Dies funktioniert auch mit anderen Elementen wie Combobox und Schaltflächen. Verwenden Sie andernfalls die Lösung unter dem Update.
Update Ende
Schimpfen
Ich habe alles ausprobiert, was ich hier und bei Google gefunden habe, und sogar versucht, meine eigenen Versionen zu erstellen. Aber jede Antwort / Lösung funktionierte hauptsächlich für Textfeldspalten, funktionierte jedoch nicht mit allen anderen Elementen (Kontrollkästchen, Kombinationsfelder, Schaltflächenspalten) oder brach sogar diese anderen Elementspalten oder hatte andere Nebenwirkungen. Vielen Dank an Microsoft, dass Datagrid sich so hässlich verhält und uns zwingt, diese Hacks zu erstellen. Aus diesem Grund habe ich beschlossen, eine Version zu erstellen, die mit einem Stil direkt auf eine Textfeldspalte angewendet werden kann, ohne andere Spalten zu beeinflussen.
Eigenschaften
Quellen
Ich habe diese Lösung und die Antwort von @ my verwendet und sie so geändert, dass sie ein angehängtes Verhalten sind. http://wpf-tutorial-net.blogspot.com/2016/05/wpf-datagrid-edit-cell-on-single-click.html
Wie man es benutzt
Fügen Sie diesen Stil hinzu. Das
BasedOn
ist wichtig , wenn Sie ein paar verwenden ausgefallene Styles für Ihre Datagrid und Sie nicht sie wollen zu verlieren.Wenden Sie den Stil mit
CellStyle
auf jeden IhrerDataGridTextColumns
wie folgt an:Fügen Sie diese Klasse jetzt demselben Namespace wie Ihrem MainViewModel hinzu (oder einem anderen Namespace. Dann müssen Sie jedoch ein anderes Namespace-Präfix als verwenden
local
). Willkommen in der hässlichen Code-Welt der angehängten Verhaltensweisen.quelle
quelle