-------基于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>
///单位类型