首页 > 其他分享 >Avalonia数据有效性验证与手动设置错误

Avalonia数据有效性验证与手动设置错误

时间:2023-04-14 21:58:08浏览次数:55  
标签:control Control string C# 手动 有效性 static public Avalonia

示例代码:https://github.com/bodong1987/AvaloniaSamples/tree/main/AvaloniaDataValidation

官方文档:https://docs.avaloniaui.net/docs/data-binding/data-validation

      Avalonia通过插件来实现数据校验,有三种方法。

1. 直接在属性的set中抛出异常。(个人不推荐这种方案)

2. 使用DataAnnotations特性(Attributes)(个人推荐这种方法)

3. 实现INotifyDataErrorInfo接口

     下面是一个简单的数据校验的示例,主要使用了异常方案和DataAnnotations方案:

using ReactiveUI;
using System;
using System.ComponentModel.DataAnnotations;

namespace AvaloniaDataValidation.ViewModels
{
    public class MainWindowViewModel : ViewModelBase
    {
        string EmailCore = "";

        [EmailAddress]
        public string Email
        {
            get => EmailCore;
            set => this.RaiseAndSetIfChanged(ref EmailCore, value);
        }

        public string[] CombItems => new string[]
        {
            "C",
            "C++",
            "C#",
        };

        string ProgramLanguageCore = "C";

        [LaungageValidation]
        public string ProgramLanguage
        {
            get => ProgramLanguageCore;
            set 
            {
                // can't use this
//                 if(value == "C#")
//                 {
//                     throw new ArgumentException($"{nameof(ProgramLanguage)} can not use C#");
//                 }

                this.RaiseAndSetIfChanged(ref ProgramLanguageCore, value);
            }
        }
    }

    internal class LaungageValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
        {
            if(value is string lan)
            {
                if (lan == "C#")
                {
                    return new ValidationResult($"[{validationContext.DisplayName}] can not be C#");
                }
            }

            return ValidationResult.Success;
        }
    }
}

      除此之外,也可以手动设置错误,如:

        private void OnShowError(object sender, RoutedEventArgs e)
        {
            if(!DataValidationErrors.GetHasErrors(textBox_Errors))
            {
                DataValidationErrors.SetError(textBox_Errors, new ArgumentException("A custom exception error"));
            }
            else
            {
                DataValidationErrors.SetError(textBox_Errors, null);
            }            
        }

      这样就可以强制设置错误了。本质上底层也是通过调用这个接口来实现这个能力的。内部其实是设置的是DataValidationErrors.ErrorsProperty:

        public static IEnumerable<object> GetErrors(Control control)
        {
            return control.GetValue(ErrorsProperty);
        }
        public static void SetErrors(Control control, IEnumerable<object> errors)
        {
            control.SetValue(ErrorsProperty, errors);
        }
        public static void SetError(Control control, Exception error)
        {
            SetErrors(control, UnpackException(error));
        }
        public static void ClearErrors(Control control)
        {
            SetErrors(control, null);
        }
        public static bool GetHasErrors(Control control)
        {
            return control.GetValue(HasErrorsProperty);
        }

      

 

标签:control,Control,string,C#,手动,有效性,static,public,Avalonia
From: https://www.cnblogs.com/bodong/p/17320049.html

相关文章

  • 上传文件时禁止用户手动输入
    常规的Web应用程序中涉及到文件上传的部分都不可避免地会使用到<inputtype="file"/>控件,在上传文件的时候通过点击“浏览”按钮,在弹出的文件选择对话框中选择本地要上传的文件。当然,如果你已经知道要上传的文件的本地路径,也可以复制路径到控件的输入框中(例如要选择的文件的路径特......
  • VMWare Horizon Linux 手动场 cannot open display 错误
    环境:系统:rhel7.9horizonagent版本:2209桌面:Gnome问题描述:防火墙已关闭的情况下,在使用LSF交互式任务时不能打开带界面的程序(xhost+已经事先执行过)。解决问题:vim/usr/lib/vmware/viewagent/bin/StartXServer.sh找到xdmcp_opt="-query127.0.0.1-once"改为xdmcp_opt......
  • GridControl手动添加控件
    1、效果privateRepositoryItemButtonEditCreateRepositoryItemButtonEdit(Dictionary<object,string>dicButtons){RepositoryItemButtonEditrepositoryBtn=newRepositoryItemButtonEdit();repositoryBtn.AppearanceDisable......
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性
    JavaSpringBoot通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到@NotEmpty否则不生效,注意看下@RequestBody前面是否加上了@ValidValidation常用注解汇总Constraint详细信息@Null被注释的元素必须为null@NotNull被注释的元素必须不......
  • 手动搭建自己的nuget服务器及使用
    手动搭建自己的nuget服务器及使用 这篇文章的主要目的:1.搭建自己的私有的nuget服务器2.打包代码为nuget包3.在其他项目中使用私有服务器上的nuget包一.搭建自己的nuget服务器1.创建一个空的ASP.NETWeb应用程序2.使用nuget管理器,添加nuget.server包安装成功以后,目......
  • Webpack中手动实现Loader与Plugin
    Loaderloader是一个转换器,用于对源代码进行转换。工作流程webpack.config.js里配置了一个模块的Loader;2.遇到相应模块文件时,触发了该模块的loader;3.loader接受了一个表示该模块文件内容的source;4.loader使用webapck提供的一系列api对source进行转换,......
  • Avalonia UI 开发环境准备 & 必须要知道的一些事情.
      开发环境准备原始文档:https://docs.avaloniaui.net/docs本文仅摘要关键部分安装VS2022安装 VS插件AvaloniaforVisualStudio2022 用于设计时的预览安装 Avalonia 项目模版打开 DeveloperPowerShellforVS2022 运行命令dotnetnewinstallAvalon......
  • Django笔记二十之手动编写migration文件
    本文首发于公众号:Hunter后端原文链接:Django笔记二十之手动编写migration文件前面介绍过,migration文件主要记录的是Django系统model的变化,然后通过migrate命令将变化适配到数据库中。比如在某个application下新增了某张表,或者对某张表更改了字段,可以生成migration......
  • 手动配置resolv.conf 文件,不被NetworkManager修改
    /etc/resolv.conf默认情况下,RedHatEnterpriseLinux(RHEL)8上的NetworkManager使用来自活动NetworkManager连接配置文件的DNS设置 动态更新文件。但是,您可以禁用此行为并在/etc/resolv.conf.笔记或者,如果您需要DNS服务器的特定顺序/etc/resolv.conf,请参阅配置DNS服......
  • Linux 手动安装Ettercap
    步骤1下载文件wgethttps://github.com/Ettercap/ettercap/archive/v0.8.3.1.tar.gz或者去官网下载:https://www.ettercap-project.org/downloads.html步骤2解压文件tarvfxz'/home/chiam/Desktop/v0.8.3.1.tar.gz'步骤3安装依赖sudoapt-getinstalldebhelperbisoncheckcm......