2011-11-04 8 views
0

ValidationSummary이 실제로로드되는 시점과로드되도록 강제 할 수있는 방법을 알고 있습니다.ValidationSummary는 언제로드됩니까?

페이지 유효성 검사를 강제하기 위해로드 된 이벤트가 발생했습니다.이 동작은 "새로운"유효성 검사를 수행하거나 ComboBox 또는 이와 유사한 이벤트를 열 때만 트리거됩니다.

어떤 아이디어 ?? 미리 감사드립니다.

public ActoMedico() 
{ 
    InitializeComponent(); 

    this.validationSummary.Loaded += new RoutedEventHandler(validationSummary_Loaded); 
} 

void validationSummary_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.forzarValidacion(); 
    } 


    private void forzarValidacion() 
    { 
     this.txtImporteMedico.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
     this.txtImporteTotal.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 

그리고 마지막으로,이 모델입니다 :

<Grid Margin="0,3"> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="120"></ColumnDefinition> 
     <ColumnDefinition Width="60" /> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="120"/> 
     <ColumnDefinition Width="60"/> 
     <ColumnDefinition Width="Auto"/> 
</Grid.ColumnDefinitions> 
<sdk:Label Grid.Column="0" Target="{Binding ElementName=txtImporteTotal}" Content="Total Acto" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5,0"></sdk:Label> 
<TextBox Grid.Column="1" Name="txtImporteTotal" Margin="5,0" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="{Binding ActoMedico.importe_total, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"></TextBox> 
<sdk:DescriptionViewer Target="{Binding ElementName=txtImporteTotal}" Grid.Column="2"></sdk:DescriptionViewer> 
<sdk:Label Grid.Column="3" Target="{Binding ElementName=txtImporteMedico}" Content="Total Médico" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="5,0"></sdk:Label> 
<TextBox Grid.Column="4" Name="txtImporteMedico" Margin="5,0" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="{Binding ActoMedico.importe_medico, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"></TextBox> 
<sdk:DescriptionViewer Target="{Binding ElementName=txtImporteMedico}" Grid.Column="5"></sdk:DescriptionViewer> 

이이 코드는 내가 유효성 검사를 강제하고있어 경우, 뒤에 수 있습니다 : 여기

내보기를 간다

#region importe_medico 
     public const string importe_medicoPropertyName = "importe_medico"; 

     private double? _importe_medico; 

     [Display(Description = "Importe")] 
     [Required(ErrorMessage = "Debe indicar el importe")] 
     public double? importe_medico 
     { 
      get 
      { 
       return _importe_medico; 
      } 

      set 
      { 
       Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = importe_medicoPropertyName }); 

       _importe_medico = value; 
       RaisePropertyChanged(importe_medicoPropertyName); 
      } 
     } 
     #endregion 

#region importe_total 
     public const string importe_totalPropertyName = "importe_total"; 

     private double? _importe_total; 
     [Display(Description = "Importe total")] 
     [Required(ErrorMessage = "Debe indicar el importe total")] 
     public double? importe_total 
     { 
      get 
      { 
       return _importe_total; 
      } 

      set 
      { 
       Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = importe_totalPropertyName }); 

       _importe_total = value; 
       RaisePropertyChanged(importe_totalPropertyName); 
      } 
     } 
     #endregion 
+0

컨트롤이 BindingValidationError 이벤트를 트리거 할 때로드되지만 뷰에 바인딩 된 뷰 모델에서 유효성 검사 오류를 생성 할 수 있습니다. – vorrtex

+0

유효성 검사 오류를 생성하려고하지만 작동하지 않는 것 같습니다. "필수"속성 텍스트를 설정하여 작업 하시겠습니까? – zapico

+1

항상 그렇지는 않습니다. 게시물에 맞지 않는 코드를 추가하면 대답하기가 훨씬 쉬워집니다. – vorrtex

답변

0

마지막으로 콤보 상자를 강요하여 모든 양식 유효성 검사를 강제 실행 한 다음 드롭 다운을 취소합니다.

그래서 나는 처음부터 모든 오류를 표시하고 사용자를위한 '저장'버튼을 비활성화 할 할 (처음부터의 ValidationSummary를 얻을.

감사 헬프 @vorrtex에 대한 너무 많은.

1

알다시피 텍스트 상자에 {Binding ActoMedico.importe_total} 같은 바인딩을 사용합니다. UserControl에 바인딩 된 개체는 ActoMedico 속성을 포함해야하며이 속성의 값은 내부 속성 importe_total을 포함해야합니다.

난 뒤에 코드에 다음 코드를 추가 한 다음 ItemViewModel 클래스 위의 코드에서

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     this.ActoMedico = new ItemViewModel(); 
    } 

    public ItemViewModel ActoMedico { get; set; } 
} 

//... 
public ActoMedico() 
{ 
    InitializeComponent(); 

    this.DataContext = new MainViewModel(); //should be set in order to make bindings work 
    this.validationSummary.Loaded += new RoutedEventHandler(validationSummary_Loaded); 
} 

의 코드 당신이 마지막 블록에서 두 속성을 포함하는 클래스입니다. 이 클래스는 응용 프로그램에서 다른 이름을 가졌지 만 그것을 모르는 사이에 이름을 지정했습니다.

이제 ValidationSummary 컨트롤이 표시되지만 Input string had an incorrect format과 같은 메시지가 표시됩니다. 이는 컨트롤에 string 데이터 형식이 필요하고보기 모델의 데이터 형식이 double?이기 때문에 발생합니다. 당신은이 문제에 대한 해결 방법으로 변환기를 작성할 수 있습니다

public class DoubleToStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     var str = (string)value; 
     double d; 

     if (!double.TryParse(str, out d)) 
      return null; 

     return d; 
    } 
} 

사용법 :

<UserControl.Resources> 
    <local:DoubleToStringConverter x:Key="DoubleToStringConverter" /> 
</UserControl.Resources> 
<!-- ... --> 
<TextBox Text="{Binding ActoMedico.importe_total, Mode=TwoWay, Converter={StaticResource DoubleToStringConverter} ... 

어쨌든 데이터 주석 작업하기 쉽지 않다, 그래서 나는 MVVM 패턴과 INotifyDataErrorInfo를 사용하는 권 해드립니다 인터페이스. 그러한 유효성 검사 here in my post의 예를 구현 했으므로 소스 코드를 다운로드하여 구현 방법을 살펴볼 수 있습니다.

+0

새로운 오류가 발생하기 전까지는 My ValidationSummary가 표시되지 않습니다 .-( – zapico

+1

@zapico 오류가없는 경우 ValidationSummary에 아무 것도 표시되지 않기 때문에 합당합니다 - – vorrtex

+0

예, 있지만 :-(. 이걸 이해할 수 없습니다 ... 윈도우의 onLoad 이벤트에 대한 유효성 검사를 강제하면 모든 컨트롤에 오류가 표시되지만 유효성 검사 요약에는 표시되지 않습니다 ... – zapico