首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时加载ValidationSummary?

何时加载ValidationSummary?
EN

Stack Overflow用户
提问于 2011-11-04 21:52:13
回答 2查看 492关注 0票数 0

我正在尝试了解ValidationSummary何时真正加载,以及如何强制加载它。

我已经暂停加载事件来强制页面验证,只有当我引起任何“新的”验证或打开一个ComboBox或类似的东西时才会触发。

有什么想法吗?提前谢谢。

下面是我的观点:

代码语言:javascript
复制
<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>

这是它背后的代码,我在这里强制验证:

代码语言:javascript
复制
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();
    }

最后,这是模型:

代码语言:javascript
复制
#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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-08 19:31:14

最后,我通过强制组合框下拉,强制所有表单验证,然后撤消下拉框来获得此结果。

因此,我从头开始获取ValidationSummary (我希望显示从开始开始的每个错误,并禁用用户的“保存”按钮。

非常感谢你的帮助@vorrtex。

票数 0
EN

Stack Overflow用户

发布于 2011-11-07 20:10:49

据我所知,您在文本框中使用的绑定类似于{Binding ActoMedico.importe_total}。这意味着绑定到UserControl的对象必须包含属性ActoMedico,并且此属性的值必须包含内部属性importe_total

我在后台代码中添加了以下代码:

代码语言:javascript
复制
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?数据类型。您可以编写一个转换器作为解决此问题的方法:

代码语言:javascript
复制
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;
    }
}

用法:

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8010202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档