gpt4 book ai didi

c# - 集合编辑器数据在设计时丢失

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:09 25 4
gpt4 key购买 nike

我正在尝试使用 Collection<T> 制作一个 WinForms 用户控件作为属性(其中 T 代表一些自定义类)。我已经阅读了很多关于这个主题的文章,但是我不能让它在设计时正常工作(在运行时一切正常)。更准确地说:当我单击属性窗口中的“...”按钮时,集合编辑器显示正常,我可以添加和删除项目。但是当我单击确定按钮时没有任何反应,当我重新打开集合编辑器时,所有项目都丢失了。当我查看设计器文件时,我看到我的属性分配给了 null,而不是组合集合。我将向您展示最重要的代码:

用户控件:

[Browsable(true),
Description("The different steps displayed in the control."),
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
Editor(typeof(CustomCollectionEditor), typeof(UITypeEditor))]
public StepCollection Steps
{
get
{
return wizardSteps;
}
set
{
wizardSteps = value;
UpdateView(true);
}
}

StepCollection 类:

public class StepCollection : System.Collections.CollectionBase
{
public StepCollection() : base() { }
public void Add(Step item) { List.Add(item); }
public void Remove(int index) { List.RemoveAt(index); }
public Step this[int index]
{
get { return (Step)List[index]; }
}
}

步骤类:

[ToolboxItem(false),
DesignTimeVisible(false),
Serializable()]
public class Step : Component
{
public Step(string name) : this(name, null, StepLayout.DEFAULT_LAYOUT){ }
public Step(string name, Collection<Step> subSteps) : this(name, subSteps, StepLayout.DEFAULT_LAYOUT){ }
public Step(string name, Collection<Step> subSteps, StepLayout stepLayout)
{
this.Name = name;
this.SubSteps = subSteps;
this.Layout = stepLayout;
}
// In order to provide design-time support, a default constructor without parameters is required:
public static int NEW_ITEM_ID = 1;
public Step()
: this("Step" + NEW_ITEM_ID, null, StepLayout.DEFAULT_LAYOUT)
{
NEW_ITEM_ID++;
}
// Some more properties
}

自定义集合编辑器:

class CustomCollectionEditor : CollectionEditor
{
private ITypeDescriptorContext mContext;

public CustomCollectionEditor(Type type) : base(type) { }

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
mContext = context;
return base.EditValue(context, provider, value);
}
protected override object CreateInstance(Type itemType)
{
if (itemType == typeof(Step))
{
Step s = (Step)base.CreateInstance(itemType);
s.parentContext = mContext; // Each step needs a reference to its parentContext at design time
return s;
}
return base.CreateInstance(itemType);
}
}

我已经尝试过的事情:

当完成这篇文章时,我刚刚找到这个主题:Simplest way to edit a collection in DesignMode?这与我遇到的问题完全相同,但是我不能使用建议的答案,因为我没有使用标准集合。

最佳答案

查看 CodeProject 上的这篇 Greate 文章,我测试了它们,它们都有效。

我认为您没有应用的主要关键区别:

  • 支持您收藏的 PropertyChanged
  • 为支持 InstanceDescriptor 的集合项类创建类型转换器。

关于c# - 集合编辑器数据在设计时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com