本文介绍了集合属性初始化问题 - 设计时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我创建了一个属性,它是一个对象集合,集合的自定义 UITypeEditor ,以及 TypeConverter 对象。所有似乎都工作正常,除非我进入并在设计师中编辑第二次或以后的集合,集合的新值未初始化。 我认为我的代码的重要部分是: 集合属性:I have created a property which is a collection of objects, with a custom UITypeEditor for the collection, and a TypeConverter for the objects. All seems to be working OK except if I go in and edit the collection in the designer for a 2nd or subsequent time, the new values of the collection are not being initialised.I think the important bits of my code are:The collection property:[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)][Editor(typeof(FileTypeEditor), typeof(UITypeEditor))]public FileTypes FileTypes { get; internal set; } = new FileTypes(); 收集项目:The collection item:[Serializable][TypeConverter(typeof(FileTypeConverter))]public class FileType {internal FileType() { }public FileType(string description, string filter) {Description = description; Filter = filter;}// ... TypeConverterThe TypeConverterclass FileTypeConverter : TypeConverter {static Regex srch = new Regex(@"^(.*)\s\((.*)\)$", RegexOptions.Compiled);public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {if (sourceType == typeof(string))return true;return base.CanConvertFrom(context, sourceType);}public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {if (destinationType == typeof(string) || destinationType == typeof(InstanceDescriptor))return true;return base.CanConvertTo(context, destinationType);}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {if (value is string) {try {Match m = srch.Match((string)value);return new FileType(m.Groups[1].Value, m.Groups[2].Value);}catch {return new FileType();}}return base.ConvertFrom(context, culture, value);}public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {if (value is FileType) {FileType ft = (FileType)value;if (destinationType == typeof(string)) {return $"{ft.Description} ({ft.Filter})";}if (destinationType == typeof(InstanceDescriptor)) {return new InstanceDescriptor(typeof(FileType).GetConstructor(new[] { typeof(string), typeof(string) }), new object[] { ft.Description, ft.Filter });}}return base.ConvertTo(context, culture, value, destinationType);}} UITypeEditorThe UITypeEditorpublic class FileTypeEditor : UITypeEditor {IWindowsFormsEditorService _editorService;public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {return UITypeEditorEditStyle.Modal;}public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {if (provider != null) {_editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;if (_editorService != null) {using (FileTypeEditorForm frm = new FileTypeEditorForm((FileTypes)value, _editorService)) {if (_editorService.ShowDialog(frm) == DialogResult.OK) {return frm.FileTypes;}}}}return value;}} 第一次编辑属性后生成的初始化代码:The generated initialisation code after the property is edited the first time:this.fileOpenDialog1.FileTypes.AddRange(new CommonItemDialog.FileType[] {new CommonItemDialog.FileType("All Files", "*.*"),new CommonItemDialog.FileType("Audio Files", "*.m4a;*.mp3;*.wav;*.wma")}); 这一切都很完美。唯一的问题是,如果我去更改集合 - 添加新项目或更改项目,此初始化不会更改以反映已编辑的集合。 什么是我在这里失踪了?我的智慧结束了。 我尝试过的事情: 搜索谷歌,阅读吨文章(包括但不限于CP here [ ^ ]和此处 [ ^ ]) - 我只是看不出我是什么缺少这里。Which is all perfect. This only issue is if I go and change the collection - add a new item, or change an item, this initialisation does not change to reflect the edited collection.What am I missing here? I'm at my wit's end.What I have tried:Searching google, reading tonnes of articles (including, but not limited to CP here[^] and here[^]) - I just can't see what I'm missing here.推荐答案,RegexOptions.Compiled); public 覆盖 bool CanConvertFrom(ITypeDescriptorContext context,Type sourceType){ if (sourceType == typeof ( string ) ) return true ; return base .CanConvertFrom(context,sourceType); } public 覆盖 bool CanConvertTo(ITypeDescriptorContext context,Type destinationType){ if (destinationType == typeof ( string )|| destinationType == typeof (InstanceDescriptor)) 返回 true ; return base .CanConvertTo(context,destinationType); } public 覆盖 object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture, object value ){ if ( value string ){ try {匹配m = srch.Match((字符串) value ); return new FileType(m.Groups [ 1 ]。值,m。组[ 2 ]。值); } catch { return new FileType(); } } 返回 base .ConvertFrom(context,culture , value ); } public 覆盖 object ConvertTo(ITypeDescriptorContext context,CultureInfo culture, object value ,输入destinationType){ if ( value FileType){ FileType ft =(FileType) value ; if (destinationType == typeof ( string )){ return", RegexOptions.Compiled);public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {if (sourceType == typeof(string))return true;return base.CanConvertFrom(context, sourceType);}public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {if (destinationType == typeof(string) || destinationType == typeof(InstanceDescriptor))return true;return base.CanConvertTo(context, destinationType);}public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {if (value is string) {try {Match m = srch.Match((string)value);return new FileType(m.Groups[1].Value, m.Groups[2].Value);}catch {return new FileType();}}return base.ConvertFrom(context, culture, value);}public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {if (value is FileType) {FileType ft = (FileType)value;if (destinationType == typeof(string)) {return {ft.Description}({ft.Filter}); } if (destinationType == typeof (InstanceDescriptor)){ return new InstanceDescriptor( typeof ( FileType).GetConstructor( new [] { typeof ( string ), typeof ( string )}), new object [] {ft.Description,ft.Filter}); } } 返回 base .ConvertTo(context,culture , value ,destinationType); } }"{ft.Description} ({ft.Filter})";}if (destinationType == typeof(InstanceDescriptor)) {return new InstanceDescriptor(typeof(FileType).GetConstructor(new[] { typeof(string), typeof(string) }), new object[] { ft.Description, ft.Filter });}}return base.ConvertTo(context, culture, value, destinationType);}} UITypeEditorThe UITypeEditorpublic class FileTypeEditor : UITypeEditor {IWindowsFormsEditorService _editorService;public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {return UITypeEditorEditStyle.Modal;}public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {if (provider != null) {_editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;if (_editorService != null) {using (FileTypeEditorForm frm = new FileTypeEditorForm((FileTypes)value, _editorService)) {if (_editorService.ShowDialog(frm) == DialogResult.OK) {return frm.FileTypes;}}}}return value;}} 第一次编辑属性后生成的初始化代码:The generated initialisation code after the property is edited the first time:this.fileOpenDialog1.FileTypes.AddRange(new CommonItemDialog.FileType[] {new CommonItemDialog.FileType("All Files", "*.*"),new CommonItemDialog.FileType("Audio Files", "*.m4a;*.mp3;*.wav;*.wma")}); 这一切都很完美。唯一的问题是,如果我去更改集合 - 添加新项目或更改项目,此初始化不会更改以反映已编辑的集合。 什么是我在这里失踪了?我的智慧结束了。 我尝试过的事情: 搜索谷歌,阅读吨文章(包括但不限于CP here [ ^ ]和此处 [ ^ ]) - 我只是看不出我是什么在这里失踪。Which is all perfect. This only issue is if I go and change the collection - add a new item, or change an item, this initialisation does not change to reflect the edited collection.What am I missing here? I'm at my wit's end.What I have tried:Searching google, reading tonnes of articles (including, but not limited to CP here[^] and here[^]) - I just can't see what I'm missing here. 这篇关于集合属性初始化问题 - 设计时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
09-05 01:27