J'ai un DataGridCombOboxColum dans un DataGrid. J'aimerais pouvoir cliquer sur la cellule une fois et avoir la liste déroulante ComboBox. Actuellement, je dois cliquer plusieurs fois.
<DataGrid AutoGenerateColumns="False" Height="148" HorizontalAlignment="Left" Margin="48,85,0,0" Name ="dg_display" VerticalAlignment="Top" Width="645" CanUserAddRows="False" CanUserDeleteRows="False" ItemsSource="{Binding}" SelectionChanged="DgDisplaySelectionChanged"> <DataGrid.Columns> <DataGridTextColumn IsReadOnly="True" Header="Symbol" Binding="{Binding Symbol}" /> <DataGridTextColumn IsReadOnly="True" Header="Company ID" Binding="{Binding CompanyID}" /> <DataGridComboBoxColumn IsReadOnly="False" Header="Sector" SelectedValueBinding="{Binding Sector}" DisplayMemberPath="{Binding [0]}" Visibility="Visible" > <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding SectorList}" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding SectorList}" /> </Style> </DataGridComboBoxColumn.ElementStyle> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid>
3 Réponses :
Édition de DataGridCombOboxcolumnColumn + Cliquez sur Cochez la case Cochez la case
Voir aussi:
https://stackoverflow.com/a/8333704/724944
xaml: p> code-derrière: p>
Le "voir aussi" est de savoir comment le faire. Utilisez un DataGridTemplatecolumn et définissez son chariot de cellt à une combinaison.
J'ai eu des problèmes avec la réponse de @ Surfen, probablement parce que c'est de nombreuses années plus tard et que WPF a probablement changé un peu. Il semble i Utilisez un Voici ma version modifiée du code de @ surfen: P> datagrid code> prend désormais soin de certaines choses pour vous, comme l'édition d'un champ de texte automatiquement lorsque vous commencez à taper.
datagridtemplatecolumn code> pour ma colonne de boîte déroulante. Le modèle a un
textblock code> pour son
Celltemplate code>. L'appel à
Beginedit code> suivi de l'appel du répartiteur provoque l'apparition de la liste déroulante dans l'arborescence visuelle. Il apparaît alors que le clic de souris est envoyé à la liste déroulante et s'ouvre par lui-même. P>
public static class DataGridExtensions
{
public static void FastEdit(this DataGrid dataGrid)
{
dataGrid.ThrowIfNull(nameof(dataGrid));
dataGrid.PreviewMouseLeftButtonDown += (sender, args) => { FastEdit(args.OriginalSource, args); };
}
private static void FastEdit(object source, RoutedEventArgs args)
{
var dataGridCell = (source as UIElement)?.FindVisualParent<DataGridCell>();
if (dataGridCell == null || dataGridCell.IsEditing || dataGridCell.IsReadOnly)
{
return;
}
var dataGrid = dataGridCell.FindVisualParent<DataGrid>();
if (dataGrid == null)
{
return;
}
if (!dataGridCell.IsFocused)
{
dataGridCell.Focus();
}
if (dataGridCell.Content is CheckBox)
{
if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
{
if (!dataGridCell.IsSelected)
{
dataGridCell.IsSelected = true;
}
}
else
{
var dataGridRow = dataGridCell.FindVisualParent<DataGridRow>();
if (dataGridRow != null && !dataGridRow.IsSelected)
{
dataGridRow.IsSelected = true;
}
}
}
else
{
dataGrid.BeginEdit(args);
dataGridCell.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => { }));
}
}
}
public static class UIElementExtensions
{
public static T FindVisualParent<T>(this UIElement element)
where T : UIElement
{
UIElement currentElement = element;
while (currentElement != null)
{
var correctlyTyped = currentElement as T;
if (correctlyTyped != null)
{
return correctlyTyped;
}
currentElement = VisualTreeHelper.GetParent(currentElement) as UIElement;
}
return null;
}
}
Quelle quantité extraordinaire de code, juste pour enregistrer l'utilisateur un clic intuitivement inutile! J'apprécie vos efforts, mais j'ai bien peur que mon opinion sur WPF ne soit retournée.
Aucune des autres réponses n'a travaillé pour moi. Ce qui a travaillé pour moi, si c'était le suivant.
<DataGridComboBoxColumn Header="Example ComboBox" DisplayMemberPath="Name" SelectedValuePath="Id"> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="IsDropDownOpen" Value="True" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn>
Cela fonctionne en partie. J'ai reçu 2 clics au lieu de 3 clics :(
Avez-vous besoin du
datagrid code> pour passer en mode édition, c'est-à-dire.
Je n'abandonne jamais le démantèlement. Est ce que j'ai besoin de?
Le premier clic sur une cellule permet de régler la mise au point sur la cellule et (peut-être) la sélectionner (dépend de la sélection de la sélection du fichier
DataGrid code>), le deuxième clic indique l'éditionElement et c'est lorsque le déménagement est soulevé ( par le
DataGrid code>). Je comprends donc que vous ne manipulez pas cet événement, ni votre logique dépend de si le fichier
datagrid code> est en mode édition (c'est-à-dire si IseditingCurrentCell == true ou iseditingrowitem == vrai), non?
Merci, c'est très utile.