Le DataGrid WPF a deux modes de sélection, célibataire ou étendu. Le WPF ListView a un tiers - multiple. Ce mode vous permet de cliquer et de sélectionner plusieurs rangées sans CTRL ou votre décalage étant maintenue. Quelqu'un sache comment faire cela pour le DataGrid? P>
4 Réponses :
Ceci n'est pas pris en charge dans la DataGrid dans la boîte à outils et on dirait que ne sera pas pris en charge lorsque le DataGrid est expédié avec .NET 4. Encore une autre raison pour laquelle ce contrôle n'est pas prêt pour l'utilisation de la production. J'irais avec l'une de ces options: p>
Je conviens que le datagrid devrait supporter cela et je pense que vous devriez devoir Fichier un bug / Suggestion pour cela quand même. Peut-être qu'il n'est pas trop tard pour l'obtenir dans .NET 4 .. :) p>
Vous pouvez essayer cette solution de contournement simple sans avoir à modifier / hériter de DataGrid Code> Contrôle en manipulant l'aperçu de la souris Event comme suit:
TheDataGrid.PreviewMouseLeftButtonDown +=
new MouseButtonEventHandler(TheDataGrid_PreviewMouseLeftButtonDown);
void TheDataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// get the DataGridRow at the clicked point
var o = TryFindFromPoint<DataGridRow>(TheDataGrid, e.GetPosition(TheDataGrid));
// only handle this when Ctrl or Shift not pressed
ModifierKeys mods = Keyboard.PrimaryDevice.Modifiers;
if (o != null && ((int)(mods & ModifierKeys.Control) == 0 &&
(int)(mods & ModifierKeys.Shift) == 0))
{
o.IsSelected = !o.IsSelected;
e.Handled = true;
}
}
public static T TryFindFromPoint<T>(UIElement reference, Point point)
where T:DependencyObject
{
DependencyObject element = reference.InputHitTest(point) as DependencyObject;
if (element == null)
return null;
else if (element is T)
return (T)element;
else return TryFindParent<T>(element);
}
Je crée une application avec une exigence similaire qui fonctionnerait pour l'écran tactile et le bureau. Après avoir passé du temps dessus, la solution que j'ai proposée semble plus propre.
Dans le concepteur, j'ai ajouté les ensembles d'événements suivants sur le DataGrid: puis dans le codeBeHind, j'ai géré les événements comme: p> J'espère que cela aide quelqu'un d'autre aussi. P> p>
Basé sur un article précédent, j'ai écrit un code MVVM ("J'aime"):
Ajoutez d'abord ceci à votre vue principale: P>
public static T FindTemplatedParentByVisualParent<T>(FrameworkElement element,Type exceptionType = null) where T : class { if (element != null && (exceptionType == null || element.TemplatedParent == null || (exceptionType != null && element.TemplatedParent !=null && !exceptionType.IsAssignableFrom(element.TemplatedParent.GetType())))) { Type type = typeof(T); if (type.IsInstanceOfType(element.TemplatedParent)) { return (element.TemplatedParent as T); } else { return FindTemplatedParentByVisualParent<T>((FrameworkElement)VisualTreeHelper.GetParent(element)); } } else return null; }