如何让DEV PropertyGridControl根据自定义Attribute特性来自定义输入显示

-------基于Dev13.2.5及以上版本

DevExpress13.2.5 及以上版本PropertyGridControl(WPF版本)这个控件同Visual Studio标准库中的PropertyGrid是同类的,都是用于快速便捷的显示一个类的Property属性,并提供用户输入的功能。具体作用可以参考MSDN,或者DevExpress HelpDocument 13.2.5。

写这个主题,主要是因为近期项目涉及到一个单位配置系统,用户需可以根据自身需要选择公制单位、英制单位以及自定义单位。在配置发生改变之后,UI涉及单位的参数输入部分则需要同步直观的跟着改变。在UI中,所有参数基本是以PropertyGridControl(WPF版本)作为用户输入接口的。

琢磨了一下,解决这个问题,脑子里大致有三种解决方案:

1.       在参数实体类中,在Property的DisplayName附加属性中加上单位,如图


显然,这种方式很不方便,要更改单位岂不是很麻烦,比如将MPa换成Pa?而且看起来也不舒服

2.       改写PropertyGridControl的Template,很显然,单单改写Template还不够,因为它缺乏单位对应的依赖项属性,那么我们需要在数据结构类中添加额外的Property来记录对应的参数的单位,显然,这个就破坏了代码的可重用性,甚至扰乱程序架构,处理数据的部分竟然还需要管UI的死活,这显然不合理。

3.       这种方法也是我采取的方法,则是通过自定义特性,给参数类属性添加单位类别的标记,然后在UI显示的时候根据单位标记来自定义显示,这个对于我们的需求也是比较合理的,也容易维护。

 

下面来具体说明:

首先,我们先模拟一个用户参数输入的类:UserParams

public class UserParams

    {

        [DisplayName("压力")]

        public double A { get; set; }

 

        [DisplayName("深度")]

        public double B { get; set; }

 

        [DisplayName("温度")]

        public double C { get; set; }

 

        public UserParams()

        {

            A = 1;

            B = 2;

            C = 3;

        }

}

 

 

可以看到,这个类用户需要三个参数,压力(MPa),深度(Km),温度(C)

其次,我们还需要构造一个自定义特性以及一个枚举来标示不同的类别的单位(UserParams类中有三种单位类别,即压力,长度,温度),类UnitTypeAttribute,枚举类型UnitTypes

///<summary>

    ///单位类型

   

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在ASP.NET Core中实现自定义验证特性(Custom Validation Attribute)的步骤如下: 1. 创建一个继承自`ValidationAttribute`的自定义验证特性类,例如: ```csharp public class CustomValidationAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // 验证逻辑 if (value is string str && str == "abc") { return ValidationResult.Success; } else { return new ValidationResult("必须是 abc"); } } } ``` 其中,`IsValid`方法是用来进行验证的,它接收两个参数:要验证的值和验证上下文。在该方法中,可以编写自定义的验证逻辑,并返回`ValidationResult`类型的结果。 2. 在需要验证的模型属性上添加自定义验证特性,例如: ```csharp public class MyModel { [CustomValidation] public string MyProperty { get; set; } } ``` 在这个例子中,`MyProperty`属性上添加了`CustomValidation`特性,表示在验证该属性时,会调用`CustomValidationAttribute`类中的`IsValid`方法。 3. 在控制器中进行验证,例如: ```csharp [HttpPost] public IActionResult MyAction([FromBody] MyModel model) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // 其他逻辑 return Ok(); } ``` 在这个例子中,控制器的`MyAction`方法接收一个`MyModel`类型的参数,该参数会被自动绑定到请求体中。在方法中,可以通过`ModelState.IsValid`属性来判断模型是否验证通过,如果验证失败,则返回`BadRequest`结果,并将`ModelState`作为响应体返回。 以上就是在ASP.NET Core中实现自定义验证特性的步骤。需要注意的是,自定义验证特性只是一种验证方式,如果需要更复杂的验证逻辑,可以使用`IValidatableObject`接口或自定义验证器来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值