2012-05-15 2 views

답변

0

다른 방법이 있습니다.

가장 깨끗한 모델은 IDataErrorInfo을 모델에 구현하고 ValidatesOnDataError=true을 바인딩에 설정하는 것입니다. (만약 당신이 IDataErrorInfo에 대해 모른다면, 매우 유용하고 사용하기가 쉽기 때문에 당신이 그것을 기댈 시간을 좀 가져야합니다.)

적은 코드를 필요로하는 또 다른 대안 그러나 좀 덜 깨끗한 수도 있습니다 :

CellEditEnding (또는 DataGrid.OnCellEditEnding 무시)에 이벤트 처리기를 추가하고 커밋되기 전에 입력 된 데이터의 유효성을 검사 할 수 있습니다. 유효성 검사가 실패하면 CellEditEnding 이벤트를 취소하면됩니다. 당신이 OnCellEditEnding를 오버라이드 (override)하는 경우

여기,

내가 당신을 위해 쉬운 예를했다 여기에 난 그냥 텍스트 입력 구문 분석하려고 (단지 이벤트 핸들러를 추가하는 등 거의 동일하다) 코드입니다. 이 충분히 명확 :)

+0

감사했다

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); } 

희망 : 당신은 여기 DataGridCellEditEndingEventArgs

EditingElement 속성을 사용하여 사용자가 입력 한 텍스트에 액세스 할 수있는 코드입니다! 다른 해결책이 효과가있었습니다. 그러나 나는 또한 "OnCellEditEnding"을 사용하여 다른 셀로 전송 된 직후/DataGrid가 포커스를 잃을 때 각 셀을 커밋합니다. 이것을 사용하면 다른 셀로 이전하면 마지막 셀을 커밋하지 않습니다. 그 주위에 방법이 있습니까? – enlilbinny

+0

글쎄 .. 내게 전혀 이상하게 보이지는 않는다. 기본적으로 DataGrid가 유효성이 확인되지 않은 텍스트를 커밋하지 못하게하려는 것이다. 따라서 무효 텍스트를 작성하고 셀을 전환하는 경우 정상적인 동작은 유효하지 않은 텍스트를 커밋하지 않는 것입니다. 맞습니까? – Damascus

+0

예, 맞습니다. 모든 키 입력을 확인하고 있습니다. – enlilbinny

관련 문제