C# 为wpf datagrid在键下移动焦点而不是选择

C# 为wpf datagrid在键下移动焦点而不是选择,c#,wpf,datagrid,wpf-controls,C#,Wpf,Datagrid,Wpf Controls,我正在使用WPF Datagrid,并已覆盖OnSelectionChange以支持从UI和代码中进行多项选择 现在,若我在任何选定的项目上按下向下箭头键,选择和焦点都会移动到下一行。我只希望焦点移动,而不是选择。我想在按下空格键或escape键时选择聚焦项目,而不是按向上/向下箭头键。如何获得这种行为。这是我的密码- <Controls:DMDataGrid Grid.Row="2" x:Name="dgrObjects"

我正在使用WPF Datagrid,并已覆盖OnSelectionChange以支持从UI和代码中进行多项选择

现在,若我在任何选定的项目上按下向下箭头键,选择和焦点都会移动到下一行。我只希望焦点移动,而不是选择。我想在按下空格键或escape键时选择聚焦项目,而不是按向上/向下箭头键。如何获得这种行为。这是我的密码-

 <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));
    }
公共类DMDataGrid:DataGrid { 公共DMDataGrid() { SelectionChanged+=DMDataGrid\u SelectionChanged; } void DMDataGrid_SelectionChanged(对象发送方,SelectionChangedEventArgs e) { 如果(如AddedItems!=null) { foreach(e.AddedItems中的变量项) { if(item.GetType()==typeof(myclass)) { (myclass))临时项=((myclass)))项; 如果(临时项目已选定) { //如果仍然选择了绑定数据项,请修复此问题 tempItem.IsSelected=true; } } } } 如果(如RemovedItems!=null) { foreach(e.RemovedItems中的var项) { if(item.GetType()==typeof((myclass))) { (myclass))临时项=((myclass)))项; 如果(临时项目已选定) { //如果仍然选择了绑定数据项,请修复此问题 tempItem.IsSelected=false; } } } } e、 已处理=正确; DMItemsList=SelectedItems; } public ICommand UnselectAll命令{get{返回新的RelayCommand((对象o)=>UnselectAll());} 公共IList管理列表 { 获取{return(IList)GetValue(DMItemsListProperty);} set{SetValue(dmitemslitproperty,value);} } SelectedItemsListChanged上的私有静态无效(DependencyObject o、DependencyPropertyChangedEventArgs e) { } public static readonly dependencProperty DMItemsListProperty=dependencProperty.Register(“DMItemsList”、typeof(IList)、typeof(DMDataGrid)、newpropertyMetadata(OnSelectedItemsListChanged)); }
然后您需要使用Tab键和Shift+Tab键,而不是箭头键。这将在焦点范围内按顺序聚焦下一个/上一个控件。我想在datagrid中导航项目,按下向下/向上箭头时,只有焦点应该移动,而不是选择。当前,当我按下datgrid selection中的向下箭头时,焦点都会移动到下一行。我希望只移动焦点。然后您可以捕获DataGrid上的PreviewKeyDown事件并设置eventArgs.Handled=True。这将阻止DataGrid继续处理该事件。然后,您可以添加自己的行为(以相同的事件处理程序或其他类似行为的方式),该行为将按索引获取下一行,并尝试对其调用.Focus()。是的,我尝试了相同的-public void dgrObjects_KeyDown(object sender,System.Windows.Input.KeyEventArgs e){DataGrid dg=(DataGrid)sender;switch(e.Key){case Key.Down:dg.MoveFocus(新的遍历请求(FocusNavigationDirection.Down));这不起作用,因为它仍在选择下一个对象。这段代码中的任何帮助都将非常有用。我的意思是,您可以使用DataGrid的ItemContainerGenerator获取下一行项目,并告诉它row.Focus()。然后,您需要使用Tab键和Shift+Tab键,而不是箭头键。这将在焦点范围内按顺序聚焦下一个/上一个控件。我想在datagrid中导航项目,在按下向下/向上箭头时,只有焦点应该移动,而不是选择。当前,当我在datgrid中按下向下箭头时,选择和焦点都会移动到下一行。我只想这样做焦点应该移动。然后您可以捕获DataGrid上的PreviewKeyDown事件并设置eventArgs.Handled=True。这将阻止DataGrid继续处理该事件。然后您可以添加自己的行为(使用相同的事件处理程序或其他类似行为),该行为将按索引获取下一行,并尝试调用.focus()是的,我尝试了相同的方法-public void dgrObjects_KeyDown(objectsender,System.Windows.Input.KeyEventArgs e){DataGrid dg=(DataGrid)sender;switch(e.Key){case Key.Down:dg.MoveFocus(新的遍历请求(FocusNavigationDirection.Down));这不起作用,因为它仍在选择下一个对象。这段代码中的任何帮助都将非常有用。我的意思是,您可以使用DataGrid的ItemContainerGenerator获取下一行项目,并告诉它row.Focus()。