ListView Вставить новый элемент на TAB

Наличие ListView WPF с элементами, привязанными к объекту данных и представленными редакторами (текст, 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 значение редактирования в последнем редакторе еще не передается бизнес-объекту. Затем при вызове this.AddSpec() ничего не получается, потому что он обнаруживает, что ошибки все еще есть. Следуй за мной еще...

И, кстати, мне это решение кажется довольно грязным. Кто-нибудь хороший совет? Добро пожаловать!


person Bernoulli IT    schedule 12.10.2011    source источник
comment
Просто любопытно, почему вы не используете WPF DataGrid? Он позволяет использовать хорошую функцию AddNewRow, которую можно замаскировать, чтобы предотвратить ошибки проверки... Он также позволяет использовать текстовые столбцы, столбцы со списком, столбцы с флажками и даже столбцы шаблонов... Проверка также хорошо поддерживается....   -  person WPF-it    schedule 12.10.2011
comment
эээ... мы начали с DevExpress DataGrid для WPF. Но у нас были некоторые проблемы с визуальным оформлением. Поэтому начал искать самодельное решение.   -  person Bernoulli IT    schedule 12.10.2011


Ответы (1)


Как упоминалось ранее, решение почти сработало. При первом обновлении привязки активного контроля было получено желаемое решение. Используя этот код:

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

if (bindingExpression != null)
  bindingExpression.UpdateSource();
person Bernoulli IT    schedule 12.10.2011