何时加载ValidationSummary?

时间:2011-11-04 13:52:13

标签: silverlight

我正在尝试实现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

2 个答案:

答案 0 :(得分: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的示例,您可以下载源代码并查看它是如何实现的。

答案 1 :(得分:0)

最后,我通过强制组合框下拉,强制所有表单验证然后撤消下拉列表来实现此目的。

所以我从一开始就得到ValidationSummary(我想要显示从开始的每个错误并禁用用户的“保存”按钮。

非常感谢你的帮助@vorrtex。

相关问题