gpt4 book ai didi

.net - 修改 PropertyGrid 中的结构属性

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

为什么 SomeClass.ClassField.StructField 属性在 propertyGrid 中没有更改?看来,在 SomeStruct 实例更改后,propertyGrid 不会调用 SomeClass.ClassField.set 。但相同的代码可以很好地使用 Point 而不是 SomeStruct

[TypeConverter(typeof(ExpandableObjectConverter))]
public struct SomeStruct
{
private int structField;

public int StructField
{
get
{
return structField;
}
set
{
structField = value;
}
}

public override string ToString()
{
return "StructField: " + StructField;
}
}

[TypeConverter(typeof(ExpandableObjectConverter))]
public sealed class SomeClass
{
public SomeStruct ClassField
{
get;
set;
}
}

...

var someClass = new SomeClass
{
ClassField = new SomeStruct
{
StructField = 42
}
};
propertyGrid.SelectedObject = someClass;

最佳答案

您需要一个特殊的 TypeConverter 来覆盖 TypeConverter.GetCreateInstanceSupported因为否则按值复制/装箱魔法会以属性网格处理所有这些的方式在幕后发生。

这是一个适用于大多数值类型的方法。您可以这样声明:

[TypeConverter(typeof(ValueTypeTypeConverter<SomeStruct>))]
public struct SomeStruct
{
public int StructField { get; set; }
}


public class ValueTypeTypeConverter<T> : ExpandableObjectConverter where T : struct
{
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
{
return true;
}

public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
{
if (propertyValues == null)
throw new ArgumentNullException("propertyValues");

T ret = default(T);
object boxed = ret;
foreach (DictionaryEntry entry in propertyValues)
{
PropertyInfo pi = ret.GetType().GetProperty(entry.Key.ToString());
if (pi != null && pi.CanWrite)
{
pi.SetValue(boxed, Convert.ChangeType(entry.Value, pi.PropertyType), null);
}
}
return (T)boxed;
}
}

请注意,它不支持纯字段结构,仅支持具有属性的结构,但 ExpandableObjectConverter 也不支持这些结构,它需要更多代码来完成。

关于.net - 修改 PropertyGrid 中的结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746897/

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