2015-07-10 72 views
0

我嘗試驗證數據網格以禁用或啓用保存按鈕。
我想在後面的代碼中能夠知道我的數據網格中是否有錯誤。對於這一點,我已經找到一個可以讓我知道是我的datgrid是有效的:驗證wpf中的數據網格

private bool HasError(DataGrid dg) 
{ 
    bool errors = (from c in 
     (from object i in dg.ItemsSource 
      select dg.ItemContainerGenerator.ContainerFromItem(i)) 
      where c != null 
      select Validation.GetHasError(c) 
     ).FirstOrDefault(x => x); 
    return errors; 
} 

我綁定在我的代碼的事件BeginningEditCellEditEnding背後:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) 
{ 
    ((MainViewModel)this.DataContext).SubVM.SaveButtonIsEnabled = false; 
} 

private void dg_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
{ 
    if (HasError(sender as DataGrid)) 
    { 
     Console.WriteLine("Error"); 
    } 
    else 
    { 
     ((MainViewModel)this.DataContext).SubVM.SaveButtonIsEnabled = true; 
     Console.WriteLine("Ok"); 
    } 

} 

因此,關鍵是在用戶輸入爲假並且使保存按鈕無效的基礎上開始。

當用戶完成編輯時,我可以(可能)啓用保存按鈕。

問題是CellEditEnding在驗證前被提出

Ok 
System.Windows.Data Error: 7 : ConvertBack cannot convert value '-78.2' (type 'String'). BindingExpression:Path=Version; DataItem='Reference' (HashCode=64396947); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String') FormatException:'System.FormatException 
à System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
à System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt) 
à System.String.System.IConvertible.ToUInt32(IFormatProvider provider) 
à System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) 
à MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture) 
à System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)' 

所以,在驗證之前,我的datagrid是valide。驗證後拋出一個異常(exptected行爲)。

如何實現我想要的? 驗證後是否還有其他事件會引發?

+0

你可以試試CellValueChanged相反,這應該運行單元價值已經改變了只後,確認懸而未決。 – SpaceSteak

+0

不幸的是,CellValueChanged不存在... – Epitouille

回答

0

這個代碼添加到CellEditEnd event

((DataGrid)sender).Dispatcher.BeginInvoke((Action)delegate() 
{ 
    try 
    { 
     // Code 
    } 
    catch (InvalidOperationException) { } 
    catch (Exception ex) { throw ex; } 
});