删除项目时,Datagrid会丢失键盘焦点

时间:2015-07-22 16:16:41

标签: c# wpf datagrid

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

我希望能够按下D键,并从ObservableCollection中删除该项目。这可以按预期工作。

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

我找到的最有用的答案就是这个 - Focus on DataGridCell for SelectedItem when DataGrid Receives Keyboard Focus - 但我不确定何时应该调用它,因为我想在视图更新后调用它,我目前正在使用SelectionChanged事件,但显然这种情况经常被使用。

我们非常感谢任何建议,我希望我在下面提供了足够的代码,让任何人都可以重新创建项目并复制问题。

非常感谢, 麦克

我的XAML代码:

<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>

我的观点模型:

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; }
    }
}

1 个答案:

答案 0 :(得分:0)

我会尝试这样的事情:

string line;
line = fileIN.readline();
int start = line.find_last_of('='); //index of last instance of char
//you need to start one behind the last index
//and end one index before the size
line = line.substr( (start + 1), (line.size() - 1) );