2011-04-15 37 views
5

我有一個tabControl。在其中一個tabitem中,我有一個包含具有CanUserAddRows =「True」的數據網格的用戶控件。用戶可以在列中輸入數據並按下輸入一個新的行被創建(我假設datagrid這樣CanUserAddRows =「真」)。 問題是,當我輸入數據和更改標籤我得到這個異常「WPF datagrid'newitemplaceholderposition'是不允許在'Addnew'開始的交易期間」WPF datagrid'newitemplaceholderposition'在'addnew'開始的交易過程中不允許使用

任何建議如何避免它?

我試圖把dg.CommitEdit()放在usercontrol.unloaded()上。我沒有得到例外,但我沒有得到新的一排。

回答

3

我遇到了同樣的問題......這裏有一些片段描述我如何解決它。請注意,在我的情況下,我想拒絕更改以避免錯誤。如果你想提交更改,這可能會使你朝着正確的方向前進。 (1)在數據網格上使用InitializingNewItem事件來捕獲添加行。

private void mydatagrid_InitializingNewItem(object sender, InitializingNewItemEventArgs e) 
    { 
     _viewmodel.NewRowDefaults((DataRowView)e.NewItem); 
    } 

1B),在這種情況下,我在我的視圖模型調用一個方法來填充行的默認值,並保存到該行的引用。

private DataRowView _drvAddingRow { get; set; } 
    public void NewRowDefaults(DataRowView drv) 
    { 
     _drvAddingRow = drv; 
     ... 
    } 

2)然後,當你需要拒絕變化(通知屬性更改或任何你的情況是)之前,請使用拍攝DataRowView的該方法的CancelEdit。

_drvAddingRow.CancelEdit(); 
3

我剛碰到同樣的問題。發現兩種可能的解決方法:

1 /觸發DataGrid的CommitEdit事件,然後調用CommitEdit。我不確定爲什麼需要這最後一步,您可能不需要在您的情況下調用CommitEdit。

 DataGrid.CommitEditCommand.Execute(this.DataGridWorkItems, this.DataGridWorkItems); 

     yourDataGrid.CommitEdit(DataGridEditingUnit.Row, false); 

2 /模擬鍵盤上的「返回」鍵行程:

 var keyEventArgs = new KeyEventArgs(InputManager.Current.PrimaryKeyboardDevice,PresentationSource.FromDependencyObject(yourDataGrid), System.Environment.ProcessorCount, Key.Return); 
     keyEventArgs.RoutedEvent = UIElement.KeyDownEvent; 
     yourDataGrid.RaiseEvent(keyEventArgs); 

我選定了最後一個解決方案,因爲我有幾個可疑的副作用與第一個。

0

我已經使用了福爾摩斯的答案,但沒有正常工作。所以我改變了一點。

這裏是我的解決方案:

首先,因爲我使用MVVM,我加入這個代碼到DataGrid:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="InitializingNewItem"> 
     <ei:CallMethodAction TargetObject="{Binding}" MethodName="OnDataGridInitializingNewItem"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

命名空間是這些:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

然後,我將此代碼添加到ViewModel並設置DataGrid:

private DataGrid _dg { get; set; } 

public void OnDataGridInitializingNewItem(object sender, InitializingNewItemEventArgs e) 
{ 
    if (_dg == null) 
     _dg = (DataGrid)sender; 
} 

畢竟,在需要的時候,我跑這個代碼:

_dg.CommitEdit(); 

最後它工作得很好:)

PS: 首先,我試過的CancelEdit方法,而不是commitEdit的。它的工作,我去了另一個看起來像彈出式打開。當我完成要做的事情並返回到視圖時,最後添加的行消失了。但它致力於數據庫。重新打開視圖後,它就在那裏。

相關問題