【发布时间】:2016-03-19 23:33:12
【问题描述】:
我一直试图在 WPF DataGrid 控件的 CellEditEnding 事件处理程序中更改同一行中的不同单元格值。
如果我编辑现有行中的单元格值,它会按预期工作。但是,在添加新行时,如果在未进入编辑模式的情况下通过鼠标单击另一个单元格值,则更改不会反映到 UI。
通过按 Tab 将焦点移动到下一个单元格也可以按预期工作,但它不应该也适用于单击吗?
public MainWindow()
{
InitializeComponent();
DataTable dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn());
dataTable.Columns.Add(new DataColumn());
DataRow existingRow = dataTable.NewRow();
dataTable.Rows.Add(existingRow);
this.MyDataGrid.ItemsSource = dataTable.DefaultView;
this.MyDataGrid.CellEditEnding += MyDataGrid_CellEditEnding;
}
void MyDataGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
(e.Row.Item as DataRowView).Row[1] = "a string that should be displayed immediatly";
}
到目前为止,我已尝试更改绑定 UpdateSourceTrigger、NotifyOnSourceUpdated 和 NotifyOnTargetUpdated,但似乎没有任何效果。我还尝试通过阅读相关主题来进行修复:http://codefluff.blogspot.fi/2010/05/commiting-bound-cell-changes.html
但这些似乎也没有帮助..
我发现一种可行的方法是遵循 sn-p:
var frameworkElement = this.MyDataGrid.Columns[1].GetCellContent(e.Row);
frameworkElement.SetValue(TextBlock.TextProperty, "a string that should be displayed immediatly");
但我不想依赖dependencyproperties,因为我可能不知道底层的显示类型。
所以问题是,在不使用提供的第二个代码 sn-p 的情况下,我可以做些什么来在新行中实现 UI 更新,因为它可以与现有行一起使用?我觉得我错过了什么..
编辑:使用 ClipboardPaste 也可以设置新值,但由于某种原因,原始编辑值会丢失。
Edit2:xaml 目前是普通的 DataGrid,我尝试手动执行列及其绑定,但由于我没有让它们工作,我已经删除它们以保持示例代码简单
<DataGrid x:Name="MyDataGrid" />
Edit3 :添加此图像以更好地描述问题。因此,单击下一个单元格后,我希望显示文本 Example image of the problem
Edit4 :使用 snoop 查看单元格似乎将元素设置为可见,也调用 .UpdateTarget();因为绑定似乎有帮助,但它不能自动工作。还在想是什么原因..
Edit5:我希望它与 DataTable 一起使用,因为我需要它的其他功能
【问题讨论】:
-
你可以使用粘贴机制:column.OnPastingCellClipboardContent( Items[ i ],"invisible string" );
-
这似乎改变了第二个单元格的值,但现在原始单元格编辑丢失了,因此感觉有点hacky。感谢您的评论,实际上可能没有任何好的方法可以做到这一点:/
-
@user5677774 你能发布你的 XAML 代码吗?
-
@Ilan 按要求添加了 xaml 代码
-
现在我真的明白你想要什么了......创建一个 DatagridTemplateColumn 并在你的 CellTemplate 中处理这种特殊行为,例如CellEditTemplate 是一个文本框,CellTemplate 是一个显示“不可见字符串”的文本块。如果您无法创建自己的列,只需将原始值存储在附加属性中