ListView在TAB上插入新项目

时间:2011-10-12 08:21:45

标签: wpf listview keydown

将WPF ListView与项目绑定到数据对象并由编辑器(Text,DateTime等)表示。我希望能够在用户位于最后一个项目的最后一个编辑器中时插入一个新项目,然后按TAB键。然后将输入焦点设置为新添加项目的第一个编辑器。

到目前为止,我有这个:

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时,最后一个编辑器上的editvalue尚未传递给业务对象。然后调用this.AddSpec()时什么都没有,因为它检测到仍然存在错误。跟着我吧......

顺便说一下,这个解决方案对我来说似乎很脏。有人建议吗?非常欢迎!

1 个答案:

答案 0 :(得分:0)

如前所述,解决方案几乎可以解决问题。首先更新活性对照的结合,产生所需的溶液。使用此代码:

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

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