2011-10-12 89 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();