2011-10-12 88 views
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()时什么也不做,因为它检测到仍然有错误。跟着我仍然...

顺便说一句,这个解决方案对我来说似乎很肮脏。任何人的好建议?非常欢迎!

+0

只是好奇你为什么不使用WPF DataGrid?它允许一个很好的AddNewRow功能,如果存在验证错误,它可以被屏蔽,不允许...它还允许文本列,组合框,复选框列,甚至模板...验证也很好地支持.... –

+0

ehhh ...我们开始使用DevExpress DataGrid for WPF。但是,我们在视觉设计上遇到了一些“问题”。于是开始考虑自制解决方案。 –

回答

0

如前所述,解决方案几乎完成了这个诀窍。首先更新主动控件的绑定,生成所需的解决方案。使用此代码:

BindingExpression bindingExpression = ((BaseEdit)sender).GetBindingExpression(TextEdit.TextProperty); 

if (bindingExpression != null) 
    bindingExpression.UpdateSource();