2010-11-25 7 views
16

XAML :액세스 WPF 컨트롤의 유효성 검사 규칙 코드

 
    <TextBox Name="textboxMin"> 
     <TextBox.Text> 
      <Binding Path="Max"> 
       <Binding.ValidationRules> 
        <local:IntValidator/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 

코드 : 대화 상자 컨트롤 중 하나 이상이 아무튼 경우

 
void buttonOK_Click(object sender, RoutedEventArgs e) 
{ 
    // I need to know here whether textboxMin validation is OK 
    // textboxMin. ??? 

    // I need to write something like: 
    // if (textboxMin.Validation.HasErrors) 
    //  return; 
} 

알고도 좋을 것이다, 어떻게, OK 버튼을 비활성화 XAML에서 바인딩을 사용하여 유효성 검사를 통과합니다. 이 방법을 사용하면 코드의 유효성 검사 상태를 확인할 필요가 없습니다.

+0

가 특정 ValidationRule이 오류가하거나 텍스트 상자에 오류가있는 경우 알고해야합니까 HasError 속성에 확인할 수 있나요? –

답변

22

Validation.HasError 당신이

BindingExpression be = textboxMin.GetBindingExpression(TextBox.TextProperty); 
be.UpdateSource(); 
UpdateSource를 BindingExpression을 얻을 호출 할 수 있습니다 뒤에 코드에서 TextProperty에 대한 모든 ValidationRules를 실행하려면이

void buttonOK_Click(object sender, RoutedEventArgs e) 
{ 
    if (Validation.GetHasError(textboxMin) == true) 
     return; 
} 

처럼 textboxMin을 위해 그것을 확인할 수 있도록 연결된 속성입니다

업데이트

붕괴에 대한 바인딩을 달성하려면 몇 단계가 필요합니다. 유효성 검사가 발생하면 버튼을 누릅니다.

먼저 모든 바인딩에 NotifyOnValidationError = "True"를 추가하십시오. 예

<TextBox Name="textboxMin"> 
    <TextBox.Text> 
     <Binding Path="Max" NotifyOnValidationError="True"> 
      <Binding.ValidationRules> 
       <local:IntValidator/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

그런 다음 Window의 Validation.Error 이벤트에 EventHandler를 연결합니다.

<Window ... 
     Validation.Error="Window_Error"> 

그리고 코드에서 우리는 추가하고 와서 같이 ObservableCollection에있는 유효성 검사 오류를 제거하고

public ObservableCollection<ValidationError> ValidationErrors { get; private set; } 
private void Window_Error(object sender, ValidationErrorEventArgs e) 
{ 
    if (e.Action == ValidationErrorEventAction.Added) 
    { 
     ValidationErrors.Add(e.Error); 
    } 
    else 
    { 
     ValidationErrors.Remove(e.Error); 
    } 
} 

를 이동 그리고 우리는이

같은 ValidationErrors.Count에 버튼의 IsEnabled를 바인딩 할 수 있습니다 뒤에

<Button ...> 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="IsEnabled" Value="False"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ValidationErrors.Count}" Value="0"> 
        <Setter Property="IsEnabled" Value="True"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
+0

첫 번째 버전 - Validation.HasError가 컴파일되지 않았습니다. 편집 후 GetHasError는 정상이며 예상 결과를 제공합니다. 감사. –

+0

이 목적을 위해 AttachedProperty 또는 Behavior를 사용하는 것이 훨씬 좋지만 NotifyOnValidationError를 언급 해 주셔서 감사합니다. –

6

당신이 얻을 필요가 당신이 규칙을 얻기 전에 먼저 바인딩

다른

당신은 BindingExpression을 가지고

BindingExpression be1 = BindingOperations.GetBindingExpression (textboxMin,TextBox.TextProperty); 

be1.HasError 
+1

BindingOperations.GetBindingExpression (textBoxMin, TextBox.TextProperty) .HasError가 트릭을 수행했습니다. –

+0

마지막으로 짧은 버전 Validation.GetHasError (textboxMin)를 사용합니다. 감사. –

+0

DataGrid의 바인딩을 확인하려면 속성으로 무엇을 넣어야합니까? 예 : BindingOperations.GetBindingExpression (myDatagrid,?). HasError – DasDas

관련 문제