2012-05-15 30 views

回答

0

你有不同的方式來做到這一點。

最簡潔的一個是在您的模型中實現IDataErrorInfo並在您的綁定中設置ValidatesOnDataError=true。 (如果你不知道IDataErrorInfo,我真的建議您花一些時間來瘦,因爲它是一個非常有用的工具,是非常容易使用)

另一種替代方案,這需要更少的代碼,但可能不那麼幹淨:

您可以添加事件處理程序到CellEditEnding(或覆蓋DataGrid.OnCellEditEnding)並驗證提交之前輸入的數據。如果驗證失敗,您只需取消CellEditEnding事件。

下面的代碼,如果你忽略OnCellEditEnding(這幾乎是完全一樣只是添加事件處理程序)

我採取了一個簡單的例子給你,在這裏我只是嘗試解析輸入的文本。 您可以訪問由用戶提供的DataGridCellEditEndingEventArgs

這裏EditingElement屬性中輸入文本是代碼:

protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e) 
     { 
      try 
      { 
       // Try to parse the text 
       double test = Double.Parse((e.EditingElement as TextBox).Text); 
      } 
      catch (FormatException) 
      { 
       // Mark the current editing element as invalid and cancel the event 
       TextBox text = e.EditingElement as TextBox; 
       BindingExpression bindingExpression = 
        BindingOperations.GetBindingExpression(text, TextBox.TextProperty); 
       BindingExpressionBase bindingExpressionBase = 
        BindingOperations.GetBindingExpressionBase(text, TextBox.TextProperty); 
       ValidationError validationError = 
        new ValidationError(new ExceptionValidationRule(), bindingExpression); 
       Validation.MarkInvalid(bindingExpressionBase, validationError); 
       e.Cancel = true; 
      } 
      base.OnCellEditEnding(e); 
     } 

希望這是很清楚:)

+0

謝謝!替代解決方案奏效。但是,我還使用「OnCellEditEnding」在轉移到另一個單元格後立即提交每個單元格/當datagrid失去焦點時。如果我使用它,轉移到另一個單元格,它不會提交最後一個單元格。有沒有辦法解決這個問題? – enlilbinny

+0

嗯..這似乎並不奇怪,我都:你基本上要你的DataGrid,以防止犯未經驗證的文本。所以如果你寫無效的文本和切換單元格,正常的行爲將是避免提交無效的文本,對吧? – Damascus

+0

是的,這是正確的。我正在檢查每個按鍵。 – enlilbinny