2011-11-04 23 views
0

我試圖實現ValidationSummary真正加載時,我如何強制它被加載。何時加載ValidationSummary?

我已經訂閱了加載的事件來強制進行頁面驗證,只有當我導致任何「新」驗證或打開ComboBox或類似的東西時纔會觸發此事件。

任何想法??提前致謝。

這裏去我的觀點:

<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> 

這是它後面的代碼,在那裏我迫使驗證:

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

最後,這是模型:

#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

我已經添加以下代碼後面的代碼:

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

ItemViewModel類上面的代碼是包含的代碼,你最後一塊這兩個屬性的類。這個類在你的應用程序中有一個不同的名字,但我不知道它,所以我用我的方式命名它。

所以現在將顯示ValidationSummary控件,但帶有諸如Input string had an incorrect format之類的消息。這是因爲TextBox控件期望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

我的ValidationSummary不會顯示,直到我強制一個新的錯誤:-( – zapico

+1

@zapico這是合理的,因爲如果沒有錯誤 - 將不會有任何內容顯示在驗證摘要中 – vorrtex

+0

是的,但有:-(。我只是不明白這一點...如果我強制驗證窗口的onLoad事件,錯誤顯示在每個控件中,但不在驗證摘要中... – zapico