猿问

在Key.Down事件上的DataGrid中选择第一项(在列表中)

当用户按下箭头键时,这是Key.Down事件,我正在尝试在Datagrid中选择第一行。


它现在可以正常工作,但是即使我通过索引[0],它仍会以某种方式选择第二行...


我创建了SelectRowByIndex方法,该方法应该选择Datagrid的第一行,如下所示:


private static void SelectRowByIndex(DataGrid dataGrid, int rowIndex)

        {

            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))

                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");


            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))

                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));


            dataGrid.SelectedItems.Clear();

            object item = dataGrid.Items[rowIndex];

            dataGrid.SelectedItem = item;


            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;

            if (row == null)

            {

                //Moram dodati BillItemTemp u slučaju da je virtualized away

                dataGrid.ScrollIntoView(item);

                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;

            }

            if (row != null)

            {

                DataGridCell cell = GetCell(dataGrid, row, 0);

                if (cell != null)

                    cell.Focus();

            }

        }


          

之后,在加载表单时,我在构造函数中调用了它:


 this.PreviewKeyDown += (s, e) =>

 {

        if (e.Key == Key.Down && dtgProducts.HasItems)

          SelectRowByIndex(dtgProducts, 0);

 };

但是以某种方式选择第二行?而不是第一个...怎么来的?


而且,当我不断按下Key.Down时不要一直选择同一行,我需要确保自己的安全。


UYOU
浏览 153回答 2
2回答

慕侠2389804

您正在与WPF战斗。你不会赢。用这种方法填充时,WPF不喜欢它。它通常希望您使用数据绑定。您可以使用viewmodels和databinding来做到这一点(如果您有兴趣的话,可以添加此答案的先前版本),但这并不困难。private static void SelectRowByIndex(DataGrid dataGrid, int rowIndex){&nbsp; &nbsp; //&nbsp; Or set this in XAML better yet&nbsp; &nbsp; dataGrid.IsSynchronizedWithCurrentItem = true;&nbsp; &nbsp; var view = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);&nbsp; &nbsp; view.MoveCurrentToPosition(rowIndex);}

慕勒3428872

假设您的意思是使用向下箭头键,则您做出了一个非常糟糕的选择。采取任何数据网格。单击一行。按向下箭头。焦点移至下一行。
随时随地看视频慕课网APP
我要回答