当我的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。但是,这里提出的问题仍然是“打开”,当我进行刷新时,我无法真正理解丢失的焦点问题()
答案 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()));
不知道为什么,但是对我有用。