Перемещение фокуса, а не выделения при нажатии клавиши для wpf datagrid - PullRequest
1 голос
/ 01 августа 2020

Я использую WPF Datagrid и переопределил OnSelectionChange для поддержки множественного выбора из пользовательского интерфейса, а также из кода.

Прямо сейчас, если я нажимаю клавишу со стрелкой вниз на любом выбранном элементе, выделение и фокус перемещаются к следующему строка. Я хочу, чтобы двигался только фокус, а не выбор. Я хочу выбрать элемент в фокусе, когда нажата клавиша пробела или клавиша выхода, а не клавиша со стрелкой вверх / вниз. Как добиться такого поведения. Вот мой код -

 <Controls:DMDataGrid  Grid.Row="2" x:Name="dgrObjects" 
                                     ItemsSource="{Binding ListOfObjects, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
                                     ScrollViewer.CanContentScroll="True"
                                     ScrollViewer.HorizontalScrollBarVisibility="Visible" AutoGenerateColumns="False"
                                     ScrollViewer.VerticalScrollBarVisibility="Visible" GridLinesVisibility="None"
                                     CanUserAddRows="false" Background="White"
                                     IsReadOnly="True" HeadersVisibility="Column"
                                     DMItemsList="{Binding SelectedObjects, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                     SelectionMode="Extended" SelectionUnit="FullRow" CanUserReorderColumns="True"
                                     CanUserSortColumns="True" Focusable="True">
            <Controls:DMDataGrid.Resources>
               <Style TargetType="DataGridRow">
                  <Setter Property="IsSelected" Value="{Binding IsObjectSelected, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
               </Style>
            </Controls:DMDataGrid.Resources>

Вот код для поведения изменения выбора -

 public class DMDataGrid : DataGrid
    {
      public DMDataGrid()
      {
         SelectionChanged += DMDataGrid_SelectionChanged;
      }

      void DMDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
         if (e.AddedItems != null)
         {
            foreach (var item in e.AddedItems)
            {
               
               if (item.GetType() == typeof(myclass))
               {
                  (myclass)) tempItem = ((myclass)))item;
                  if (tempItem.IsSelected)
                  {
                     // if bound data item still is selected, fix this
                     tempItem.IsSelected = true;
                  }
               }
            }
         }
         if (e.RemovedItems != null)
         {
            foreach (var item in e.RemovedItems)
            {
              
               if (item.GetType() == typeof((myclass))))
               {
                  (myclass)) tempItem = ((myclass)))item;
                  if (tempItem.IsSelected)
                  {
                     // if bound data item still is selected, fix this
                     tempItem.IsSelected = false;
                  }
               }
            }
         }

         e.Handled = true;

         DMItemsList = SelectedItems;
      }

      public ICommand UnselectAllCommand { get { return new RelayCommand<object>((object o) => UnselectAll()); } }

      public IList DMItemsList
      {
         get { return (IList)GetValue(DMItemsListProperty); }
         set { SetValue(DMItemsListProperty, value); }
      }
      private static void OnSelectedItemsListChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
      {
      }
      public static readonly DependencyProperty DMItemsListProperty = DependencyProperty.Register("DMItemsList", typeof(IList), typeof(DMDataGrid), new PropertyMetadata(OnSelectedItemsListChanged));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...