当前位置: 首页 > news >正文

HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器


第一步:自定义控件的TypeDescription描述。


为了扩展.NET的类型描述系统(Type Descriptor System),在运行时动态地更改对象的属性,使得这些属性在PropertyGrid上下文中不会被显示。
1.CLTypeDescriptionProvider:这是一个TypeDescriptionProvider的实现。TypeDescriptionProvider是.NET的一部分,用于提供有关类型的信息。在这个实现中,它将返回一个自定义的ICustomTypeDescriptor实现,即CLTypeDescriptor。

2.CLTypeDescriptor:这是一个ICustomTypeDescriptor的实现。ICustomTypeDescriptor为对象提供了一种方式来提供有关其属性的自定义信息。在这个实现中,它将返回一个包含自定义PropertyDescriptor的PropertyDescriptorCollection。

3.CLPropertyDescriptor:这是一个PropertyDescriptor的实现。PropertyDescriptor描述了一个对象的属性,包括其名称、类型、默认值等。在这个实现中,它将返回一个修改过的AttributeCollection,该AttributeCollection包含一个新的BrowsableAttribute,其值为false。这意味着这个属性在PropertyGrid上下文中不会被显示。


这是代码:

public class CLTypeDescriptionProvider : TypeDescriptionProvider
{public CLTypeDescriptionProvider(): base(TypeDescriptor.GetProvider(typeof(object))) { }public override ICustomTypeDescriptor GetTypeDescriptor(Type type, object o){ICustomTypeDescriptor baseDescriptor = base.GetTypeDescriptor(type, o);return new CLTypeDescriptor(baseDescriptor);}
}public class CLTypeDescriptor : CustomTypeDescriptor
{ICustomTypeDescriptor original;public CLTypeDescriptor(ICustomTypeDescriptor originalDescriptor): base(originalDescriptor) { original = originalDescriptor; }public override PropertyDescriptorCollection GetProperties(){ return this.GetProperties(new Attribute[] { }); }public override PropertyDescriptorCollection GetProperties(Attribute[] attributes){var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>().Select(p => new CLPropertyDescriptor(p)).ToArray();return new PropertyDescriptorCollection(properties, true);}
}public class CLPropertyDescriptor : PropertyDescriptor
{PropertyDescriptor o;public CLPropertyDescriptor(PropertyDescriptor originalProperty): base(originalProperty) { o = originalProperty; }public override bool CanResetValue(object component){ return o.CanResetValue(component); }public override object GetValue(object component) { return o.GetValue(component); }public override void ResetValue(object component) { o.ResetValue(component); }public override void SetValue(object component, object value){ o.SetValue(component, value); }public override bool ShouldSerializeValue(object component){ return o.ShouldSerializeValue(component); }public override AttributeCollection Attributes{get{var attributes = base.Attributes.Cast<Attribute>().ToList();var category = attributes.OfType<CategoryAttribute>().FirstOrDefault();//if (category != null && category.Category == "Extra") attributes.Add(new BrowsableAttribute(true));attributes.Add(new BrowsableAttribute(false));return new AttributeCollection(attributes.ToArray());}}public override Type ComponentType { get { return o.ComponentType; } }public override bool IsReadOnly { get { return o.IsReadOnly; } }public override Type PropertyType { get { return o.PropertyType; } }
}

第二步:自定义控件注入类特性CLTypeDescriptionProvider,字段特性Category、Browsable、DisplayName、Editor。


1.CategoryAttribute:这个特性用于将属性分组到特定的类别中。在PropertyGrid控件中,类似的属性可以被组织在一起。例如,你可以使用`[Category("Appearance")]`来指示属性应该在"Appearance"类别下显示。

2.BrowsableAttribute:这个特性用于控制属性是否应PropertyGrid控件中显示。如果你设置`[Browsable(false)]`,该属性将不会在属性浏览器中显示。

3.DisplayNameAttribute:这个特性用于控制属性在PropertyGrid控件中的显示名称。默认情况下,属性的名称就是它在代码中的名称。但是,你可以使用`[DisplayName("My Property")]`来改变它在属性浏览器中的显示名称。

4.EditorAttribute:这个特性用于指定用于编辑属性的编辑器。这个编辑器可以是一个字符串编辑器,也可以是一个复杂的用户界面。例如,你可以使用`[Editor(typeof(MyCustomEditor), typeof(UITypeEditor))]`来指定一个自定义的编辑器。在这个例子中,`MyCustomEditor`需要继承自`UITypeEditor`类,它提供了创建和管理属性编辑器的方法。


这是代码:

    [TypeDescriptionProvider(typeof(CLTypeDescriptionProvider))]public class ClLabel : UserControl, IExecutable, ICommunicationBindable{
[Browsable(true)]
[Category("自定义项目")]
[DisplayName("VM项目")]
[Editor(typeof(WpfApp2.OpenCollectionEditor), typeof(OpenCollectionView))]
public CustomType VMItem
{get { return (CustomType)GetValue(VMItemProperty); }set { SetValue(VMItemProperty, value); }
}

第三步:实现自定义编辑器,该类继承自PropertyEditorBase。OpenCollectionEditor是一个自定义编辑器,用于编辑属性。


`OpenCollectionEditor`类覆盖了`PropertyEditorBase`的两个方法:`CreateElement`和`GetDependencyProperty`。

1.CreateElement方法接受一个`PropertyItem`参数,该参数表示要编辑的属性。在此方法中,你首先获取属性的值(假设它是一个`ClLabel`类型的对象),然后创建一个`OpenCollectionView`对象,并将`ClLabel`对象的`VMItem`属性设置为`OpenCollectionView`的`customType`。然后,你将`VMItem`对象序列化为JSON字符串,并设置为`OpenCollectionView`的`txt`文本。最后,你返回`OpenCollectionView`对象,这个对象将用于编辑属性。

2.GetDependencyProperty方法返回一个`DependencyProperty`对象,该对象表示`OpenCollectionView`的`CustomTypeProperty`。`DependencyProperty`是WPF中的一个重要概念,它支持属性值的继承,数据绑定等功能。
这是代码:

 public class OpenCollectionEditor : PropertyEditorBase{public override FrameworkElement CreateElement(PropertyItem propertyItem) {var model = propertyItem.Value as ClLabel;OpenCollectionView openCollectionView = new OpenCollectionView();openCollectionView.customType = model.VMItem;openCollectionView.txt.Text=JsonConvert.SerializeObject(model.VMItem);return openCollectionView;} public override DependencyProperty GetDependencyProperty() => OpenCollectionView.CustomTypeProperty;}

第三步:实现显示的自定义属性。

 public partial class OpenCollectionView : UserControl{public OpenCollectionView(){InitializeComponent();DataContextChanged += OpenCollectionView_DataContextChanged;}private void OpenCollectionView_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e){RelayCommand<CustomType> cmd = new RelayCommand<CustomType>(param =>{var editor = new CustomControlWindow();editor.ShowDialog();return editor.selectedItem;});cmd.Executed += result =>{txt.Text = JsonConvert.SerializeObject(result);};btn.Command = cmd;}public CustomType customType{get => (CustomType)GetValue(CustomTypeProperty);set => SetValue(CustomTypeProperty, value);}public static readonly DependencyProperty CustomTypeProperty = DependencyProperty.Register(nameof(customType), typeof(CustomType), typeof(OpenCollectionView), new PropertyMetadata(default(CustomType)));public ICommand ServoOMCItemEditCommand { get; set; }}

相关文章:

HandyControl的属性编辑器如何绑定自定义控件,并集成到自定义编辑器

第一步&#xff1a;自定义控件的TypeDescription描述。 为了扩展.NET的类型描述系统(Type Descriptor System)&#xff0c;在运行时动态地更改对象的属性&#xff0c;使得这些属性在PropertyGrid上下文中不会被显示。 1.CLTypeDescriptionProvider&#xff1a;这是一个TypeDesc…...

【Python】使用 Python 检测图像中(色差对比度较大)的水印

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 前言 在图像处理领域中&#xff0c;检测图像中的水印是一项重要任务。水印通常用于保护图像…...

最短路:Bellman-Ford

最短路&#xff1a;Bellman-Ford 题目描述参考代码 题目描述 输入样例 3 3 1 1 2 1 2 3 1 1 3 3输出样例 3参考代码 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 510, M 10010;int n, m, k; int dist…...

深度学习的分类网络

深度学习的分类网络 深度学习的分类网络&#xff08;Classification Networks&#xff09;是用于将输入数据分配到预定义类别的神经网络。它们广泛应用于图像分类、文本分类、语音识别等任务。以下是对深度学习分类网络的详细介绍&#xff0c;包括其基本概念、主要架构、常见模…...

Si24R05—高度集成的低功耗 2.4G+125K SoC 芯片

Si24R05是一款高度集成的低功耗SoC芯片&#xff0c;具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、3D低频唤醒接收器等丰富的外设。内核采用RISC-V RV32IMAC&#xff08;2.6 …...

layuimini框架实现点击菜单栏回到起始页

在layui页面中&#xff0c;如果使用了 window.location.href""进行了页面跳转&#xff0c;再点击菜单栏是不会显示起始页&#xff0c;而是跳转后的页面&#xff0c; 解决&#xff1a; 在miniTab.js文件中找到&#xff1a;listen方法 将其中修改为&#xff1a; if …...

【ubuntu22.04~mysql-MHA-mycat】

ubuntu22.04~mysql-MHA-mycat 前言一、安装指定版本mysql-server(8.0.23)1、安装mysql2、启用修改mysql配置1、安装3、修改权限3.1、用户密码存放位置,3.2、创建用户root@%4、mysql配置文件my.cnf修改1、主节点my.cnf2、slave1~my.cnf修改项3、slave2~my.cnf修改项5、重启mys…...

Java Reflection 反射使用 完全指南

前言 Java 中的反射大家都不陌生&#xff0c;有很多很好的文章都进行了讲解&#xff0c;但是很难找到一篇文章能完全解释反射的所有用法&#xff0c;特别是反射获取这个对象的注解的信息和泛型信息&#xff0c;往往都停留在了获取类的函数、方法&#xff0c;构造上。所以这篇文…...

2024年适合学生写作业的台灯推荐:五款公认好用的护眼台灯

儿童的视力健康是每一个家庭都极为关注的问题。目前中国近视率居高不下&#xff0c;且呈现出年轻化、低龄化的趋势。儿童近视的问题愈发严重&#xff0c;如何才能让孩子在学习的同时&#xff0c;眼睛也能得到充分的保护&#xff1f;答案就是护眼台灯。护眼台灯通常拥有柔和的光…...

电商平台API电商平台数据传输(商品订单店铺数据采集)

API&#xff08;Application Programming Interface&#xff09;是一种用于应用程序之间相互通信和交互的接口。它定义了一组规范和协议&#xff0c;允许软件系统之间传递数据和请求服务。 API的基本概念包括&#xff1a; 1. 接口&#xff1a;API作为接口&#xff0c;提供了一…...

【LeetCode每日一题】3067. 在带权树网络中统计可连接服务器对数目-DFS和图

Hey我的编程小伙伴们&#x1f44b;&#xff0c;今天我要和大家分享一道我在LeetCode上遇到的超有趣的题目——编号3067的在带权树网络中统计可连接服务器对数目。这是一道非常适合练习DFS和图的题目哦&#xff01;&#x1f913;&#x1f4bb; 邻接图是什么&#xff1f; 在我们…...

java中的时间相关类

LocalDate: 用于表示日期。 public final class LocalDate {private final int year;private final int month;private final int day;}LocalTime: 用于表示时间。 public final class LocalTime {private final byte hour;private final byte minute;private final byte se…...

大模型的现状与未来:探索腾讯元宝APP及其他AIGC产品

前言 随着近日腾讯元宝APP的正式上线&#xff0c;国内大模型产品又添一员。近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;AIGC&#xff08;AI生成内容&#xff09;产品逐渐成为技术与商业应用的热点。各大互联网厂商纷纷推出自己的大模型产品&#xff0c;以期在这…...

记录一个apisix修改后台接口超时时间的方法

垃圾程序猿搞了个数据导入&#xff0c;解析校验比较复杂&#xff0c;1000条就要70秒。apisix默认60s超时&#xff0c;导致提交导入功能总是失败。 非要先调整超时时间。这里记录一下 到服务器配置yaml如下&#xff1a; apiVersion: apisix.apache.org/v2 kind: ApisixUpstrea…...

地产样板间vr全景云展平台降低售房压力

在数字化浪潮的推动下&#xff0c;传统的实体展厅正面临着巨大的转型压力。高昂的搭建、物流、安保成本&#xff0c;以及展览的周期性和资源浪费&#xff0c;都成为了展商们不得不面对的难题。然而&#xff0c;现在有了商品3D线上展台搭建编辑器&#xff0c;这些问题都迎刃而解…...

性能测试2【搬代码】

1.性能测试脚本完善以及增强 2.jmeter插件安装以及监控使用 3.性能压测场景设置&#xff08;基准、负载、压力、稳定性&#xff09; 4. 无界面压测场景详解 一、性能测试脚本完善以及增强 使用控制器的目的是使我们的脚本更加接近真实的场景 1.逻辑控制器: 【事务控制器】&…...

Chromium源码阅读:深入理解Mojo框架的设计思想,并掌握其基本用法(1)

Mojo简介 Mojo 是一个运行时库的集合&#xff0c;提供与平台无关的通用 IPC 原语抽象、消息 IDL 格式以及具有针对多种目标语言的代码生成的绑定库&#xff0c;以便于跨任意进程间和进程内边界传递消息。 Mojo 分为清晰分离的层&#xff0c;子组件的基本层次结构如下&#xff…...

通用大模型VS垂直大模型对比

通用大模型和垂直大模型的区分主要在于它们的设计目的、应用范围、训练数据、优化目标和使用场景。以下是一些关键点&#xff0c;用以区分这两种模型&#xff1a; 设计目的&#xff1a; 通用大模型&#xff1a;设计用于处理多种类型的任务&#xff0c;不特定于某一领域。垂直大…...

时尚解决方案来袭:几分钟即可生成高清商拍大片

在时尚行业&#xff0c;视觉展示的重要性不可小觑。商品图片不仅代表品牌的风格调性&#xff0c;而且直接影响消费者的购买行为。可以说&#xff0c;视觉营销在服装行业中的地位至关重要。 尽管如此&#xff0c;视觉营销的传统产出渠道——商业摄影&#xff0c;因其高成本、复杂…...

【每日一练】day1

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; &#x1f388;丠丠64-CSDN博客&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...