WPF Datagrid项目刷新失去焦点

时间:2013-04-11 08:06:58

标签: wpf datagrid focus refresh

当我的observableCollection在viewmodel中更新时刷新我的数据网格一直是个噩梦。在我发现DataGrid不会响应ObservableCollection引发的事件后,我发现了DataGrid.Items.Refresh。 它确实刷新,但DataGrid失去了焦点。我有一个简单的列表,我想在按一个键然后更新时更改一个值。用户在使用键盘快捷键时必须再次选择鼠标是不可接受的...... 这是一个简单的例子:

            <DataGrid x:Name="MyDataGrid" SelectionMode="Single" AutoGenerateColumns="False" IsReadOnly="True" KeyUp="MyDataGrid_KeyUp">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="First Name" Binding="{Binding Path=First}"/>
                    <DataGridTextColumn Header="Last Name" Binding="{Binding Path=Last}"/>
                </DataGrid.Columns>
            </DataGrid>

背后的代码:

    private void MyDataGrid_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key.Equals(Key.Space))
        {
            MyDataGrid.Items.Refresh();
        }
    }

P.S。在这个例子中,我在我的代码中设置ItemsSource,而不是绑定到ObservableCollection。我也只使用代码隐藏而不是ViewModel,但问题是相同的。

编辑:最初的问题是我没有在我班级使用NotifyPropertyChanged。但是,这里提出的问题仍然是“打开”,当我进行刷新时,我无法真正理解丢失的焦点问题()

2 个答案:

答案 0 :(得分:1)

当我的observableCollection在viewmodel中更新时刷新我的数据网格一直是个噩梦。 - 为什么这是一场噩梦?应该很容易。

关于你的问题。请尝试以下

private void MyDataGrid_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key.Equals(Key.Space))
    {
        MyDataGrid.Items.Refresh();
        MyDataGrid.Focus();
    }
}

您可以找到相关文档here

修改
我们来试试这个

private void MyDataGrid_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key.Equals(Key.Space))
    {
        MyDataGrid.Items.Refresh();
        FocusManager.SetFocusedElement(MyDataGrid);
    }
}

有关详细信息,请查看here

答案 1 :(得分:0)

通过分派器安排刷新对我来说很有效(使用TreeView)。

所以不要这样做(失去焦点):

tree.Items.Refresh();

我这样做(不失去焦点):

Dispatcher.BeginInvoke(new Action(() => tree.Items.Refresh()));

不知道为什么,但是对我有用。