一旦单元格从编辑中失去焦点,我需要能够更新数据集的值。我知道当单元格失去焦点时(CellEditEnding),但问题是,它的上下文项的实际更新不会发生,直到实际发生该行的焦点。当只剩下一个项目时,这将成为一个巨大的问题,因为它可能永远不会失去焦点。
如何确保每次完成列编辑(CellEditEnding)时,该行的实际上下文会在该点更新(而不仅仅是当行失去焦点时)
提前致谢!
答案 0 :(得分:9)
您可以使用DataGrid.CommitEdit
处理程序中的DataGrid.CellEditEnding
,确保处理重入。
这是一篇描述该技术的博客文章:
答案 1 :(得分:8)
我遇到了类似的问题,我有一个包含5列的DataGrid行。 只有在整个数据网格行失去焦点后,才会在源代码中更新5列中的数据。
经过一番搜索,我发现了一种简单的方法。 那就是添加" UpdateSourceTrigger = LostFocus"在你的数据库中的数据绑定。
例如:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox DisplayMemberPath="Name"
ItemsSource="{Binding Path=MyDataSets}"
SelectedValue="{Binding Path=DataSelected, UpdateSourceTrigger=LostFocus}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
这样就可以了,所以当每个单元格失去焦点而不是整行时,来自单元格的数据将立即更新源。
答案 2 :(得分:3)
我遇到了类似的问题,“正常”修复程序均无效...
对我有用的是按如下方式使用CommitEdit()
的重载版本
DataGrid1.CommitEdit(DataGridEditingUnit.Row, true);
答案 3 :(得分:0)
只需通过调用[control]跳转到对话框的任何其他控件。焦点()。在 OnClosing ()事件中执行此操作。
LostFocus是数据单元的默认更新触发器。但窗口本身以及窗口的边框或标题(以及系统按钮&#34; X&#34;)无法获得焦点。这就是编辑没有结束的原因。
答案 4 :(得分:0)
您可以使用任何其他对象的任何PreviewMouseMove事件。 在我的情况下,我希望datagrid在向其添加新行之前失去控制。
MainWindow.xaml.cs
private void MenuItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
Grid.CommitEdit();
}
MainWindow.xaml
<MenuItem Header="New Line" Command="{Binding CommandNewRow}" PreviewMouseMove="MenuItem_PreviewMouseMove"/>
MainWindowViewModel.cs
public ICommand CommandNewRow
{
get
{
if (_commandNewRow == null)
{
_commandNewRow = new RelayCommand(p => CommandNewRowExecute(), p => CommandNewRowCanExecute());
}
return _commandNewRow;
}
}
private void CommandNewRowExecute()
{
FileList.Add(new File("", ""));
}
private bool CommandNewRowCanExecute()
{
if (FileList.Count > 0)
return true;
return false;
}