数据网格在删除项时失去键盘焦点
本文关键字:失去 键盘 焦点 删除 数据网 网格 数据 | 更新日期: 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];
}