0
让WPF ListView具有绑定到数据对象并由编辑器(文本,日期时间等)表示的项目。我希望能够插入一个新的项目,当用户在最后一个项目的最后一个编辑器中,然后按Tab键。然后将输入焦点设置为新添加项目的第一个编辑器。ListView在标签上插入新项目
到目前为止我有这样的:
private Boolean _tabAddedNewSpec = false;
private void OnBaseEditKeyDown(object sender, KeyEventArgs e)
{
if (!_tabAddedNewSpec)
{
if (e.Key == Key.Tab)
if (this.listview.SelectedItem == this.listview.Items[this.listview.Items.Count - 1])
{
this.AddSpec();
// No further tabbing out of this control, we manage it ourselves in this special case...
e.Handled = true;
_tabAddedNewSpec = true;
// Select last item (is NEW one)
this.listview.SelectedItem = this.listview.Items[this.listview.Items.Count - 1];
}
}
}
private void OnBaseEditKeyUp(object sender, KeyEventArgs e)
{
if (_tabAddedNewSpec)
{
((BaseEdit)sender).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
_tabAddedNewSpec = false;
}
}
此代码几乎不会把戏。但是,如果存在其他包含验证错误的规格(在业务对象上),则不允许添加规范(规范)。问题是,当按Tab键时,最后一个编辑器的编辑值尚未传递给业务对象。然后当调用这个.AddSpec()时什么也不做,因为它检测到仍然有错误。跟着我仍然...
顺便说一句,这个解决方案对我来说似乎很肮脏。任何人的好建议?非常欢迎!
只是好奇你为什么不使用WPF DataGrid?它允许一个很好的AddNewRow功能,如果存在验证错误,它可以被屏蔽,不允许...它还允许文本列,组合框,复选框列,甚至模板...验证也很好地支持.... –
ehhh ...我们开始使用DevExpress DataGrid for WPF。但是,我们在视觉设计上遇到了一些“问题”。于是开始考虑自制解决方案。 –