2

当我的 observableCollection 在视图模型中更新时刷新我的数据网格是一场噩梦。在我发现 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();
        }
    }

ps 在这个例子中,我在后面的代码中设置了 ItemsSource,而不是绑定到 ObservableCollection。另外我只使用代码隐藏而不是 ViewModel,但问题是一样的。

编辑:最初的问题是我没有在课堂上使用 NotifyPropertyChanged。但是,这里提出的问题仍然是“开放的”,当我执行 Refresh() 时,我无法真正理解失去焦点的问题

4

2 回答 2

1

当我的 observableCollection 在视图模型中更新时刷新我的数据网格是一场噩梦。- 为什么这是一场噩梦?不过应该很容易。

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

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

您可以在此处找到相关文档。

编辑
让我们试试这个

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

欲了解更多信息,请查看此处

于 2013-04-11T08:26:50.853 回答
0

通过调度程序安排刷新对我有用(使用 TreeView)。

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

tree.Items.Refresh();

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

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

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

于 2019-10-31T10:45:26.023 回答