数据网格在删除项时失去键盘焦点

本文关键字:失去 键盘 焦点 删除 数据网 网格 数据 | 更新日期: 2023-09-27 18:04:08

我发现了一些类似的问题,但没有一个能完全解决我的问题,所以我把一个小例子放在一起。

我希望能够按下D键,并从ObservableCollection中删除该项。

然后我希望能够继续使用箭头键和D键从我刚刚删除的行后操作数据网格(即更新的数据网格的索引等于已删除项目的索引)。

我发现最有用的答案是这一个-当DataGrid接收键盘焦点时,关注DataGridCell为SelectedItem -然而,我不确定何时应该调用它,因为我想在视图更新后调用它,我目前正在使用SelectionChanged事件,但显然这被调用得太频繁了。

任何建议都将非常感激,我希望我已经提供了足够的代码,使任何人都可以重新创建项目并复制问题。

很多谢谢,迈克

My XAML code:

<Window x:Class="DataGridProblem.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid ItemsSource="{Binding MyItems}"
                  SelectedItem="{Binding SelectedItem}">
            <DataGrid.InputBindings>
                <KeyBinding Key="D" Command="{Binding Delete}"/>
            </DataGrid.InputBindings>
        </DataGrid>
    </Grid>
</Window>

My view model:

namespace DataGridProblem
{
    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private ObservableCollection<MyItem> _myItems;
        private ICommand _delete;
        public MyItem SelectedItem { get; set; }
        public ICommand Delete { get { return _delete; } }
        public ObservableCollection<MyItem> MyItems
        {
            get { return _myItems; }
            set
            {
                _myItems = value;
                OnPropertyChanged("MyItems");
            }
        }
        public ViewModel()
        {
            _myItems = new ObservableCollection<MyItem>();
            _myItems.Add(new MyItem() { name = "John" });
            _myItems.Add(new MyItem() { name = "Mike" });
            _myItems.Add(new MyItem() { name = "Phil" });
            _delete = new RelayCommand(DeleteSelected);
        }
        private void DeleteSelected(object obj)
        {
            MyItems.Remove(SelectedItem);
        }
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

MyItem:

namespace DataGridProblem
{
    public class MyItem
    {
        public string name { get; set; }
    }
}

数据网格在删除项时失去键盘焦点

我会尝试这样做:

private void DeleteSelected(object obj)
    {
        var index = MyItems.IndexOf(SelectedItem);
        MyItems.Remove(SelectedItem);
        if (MyItems.Count > 0)
           SelectedItem = MyItems[index >= MyItems.Count ? index-1 : index];
    }