gpt4 book ai didi

c# - 在属性网格中编辑集合的正确方法是什么

转载 作者:行者123 更新时间:2023-12-02 11:11:32 25 4
gpt4 key购买 nike

我有一个显示在属性网格中的类。其中一个属性是 List<SomeType> .

设置代码的最简单/正确的方法是什么,以便我可以通过属性网格添加和删除此集合中的项目,最好使用标准 CollectionEditor .

错误的方法之一是这样的:

set not being called when editing a collection

用户annakata建议我公开IEnumerable接口(interface)而不是集合。有人可以向我提供更多详细信息吗?

我有一个额外的复杂情况,即 get 返回的集合实际上并不指向我类(class)中的成员,而是从其他成员动态构建的,如下所示:

public List<SomeType> Stuff
{
get
{
List<SomeType> stuff = new List<SomeType>();
//...populate stuff with data from an internal xml-tree
return stuff;
}
set
{
//...update some data in the internal xml-tree using value
}
}

最佳答案

这是一个有点棘手的问题;该解决方案涉及使用完整的 .NET Framework 进行构建(因为仅限客户端的框架不包括 System.Design)。您需要创建自己的 CollectionEditor 子类,并告诉它在 UI 完成后如何处理临时集合:

public class SomeTypeEditor : CollectionEditor {

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

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
object result = base.EditValue(context, provider, value);

// assign the temporary collection from the UI to the property
((ClassContainingStuffProperty)context.Instance).Stuff = (List<SomeType>)result;

return result;
}
}

然后您必须使用 EditorAttribute 来装饰您的属性:

[Editor(typeof(SomeTypeEditor), typeof(UITypeEditor))]
public List<SomeType> Stuff {
// ...
}

是的,又长又复杂,但它确实有效。在集合编辑器弹出窗口中单击“确定”后,您可以再次打开它,并且值将保留。

注意:您需要导入命名空间 System.ComponentModelSystem.ComponentModel.DesignSystem.Drawing.Design

关于c# - 在属性网格中编辑集合的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145324/

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