Winforms (C+;+;/CLI)嵌套结构';的属性值在Propertygrid中没有更改

Winforms (C+;+;/CLI)嵌套结构';的属性值在Propertygrid中没有更改,winforms,c++-cli,Winforms,C++ Cli,首先,我想告诉大家,我对C++/CLI编程非常陌生,如果我的问题看起来很基本,我向您道歉。我一整天都在网上寻找解决方案,但都没有成功 我有一个值结构,它有另一个值结构作为其数据成员之一。所有特性都显示在Propertygrid上,可以编辑。但是,当我尝试修改嵌套结构的属性时,新值不会保留,它会立即恢复为0。为什么会发生这种情况?如何保留为嵌套结构输入的值 注意:我试图注释掉void set(nestedStruct value){temp=value;},但仍然面临相同的问题 [TypeConv

首先,我想告诉大家,我对C++/CLI编程非常陌生,如果我的问题看起来很基本,我向您道歉。我一整天都在网上寻找解决方案,但都没有成功

我有一个值结构,它有另一个值结构作为其数据成员之一。所有特性都显示在Propertygrid上,可以编辑。但是,当我尝试修改嵌套结构的属性时,新值不会保留,它会立即恢复为0。为什么会发生这种情况?如何保留为嵌套结构输入的值

注意:我试图注释掉void set(nestedStruct value){temp=value;},但仍然面临相同的问题

[TypeConverter(ExpandableObjectConverter::typeid)]
public value struct nestedStruct
{
    int z;
    property int Z
    {
        int get()           { return z; }
        void set(int value) { z = value; }
    };
};

public value struct parentStruct
{
    int x;
    property int X
    {
        int get()           { return x; }
        void set(int value) { x = value; }
    };

    int y;
    property int Y
    {
        int get()           { return y; }
        void set(int value) { y = value; }
    };

    nestedStruct temp;
    property nestedStruct Temp
    {
        nestedStruct get()          { return temp; }
        void set(nestedStruct value){ temp = value; }
    };
};
指定给属性网格:

parentStruct testStruct;
propertyGrid1->SelectedObject = testStruct;
propertyGrid1->ExpandAllGridItems();
我发现C#标签下的这篇文章非常有助于解决这个问题:

我只需要覆盖ExpandableObjectConverter中的CanConvertFrom()

public ref class MyExpandableObjectConverter : ExpandableObjectConverter
{
public:
    virtual bool CanConvertFrom(ITypeDescriptorContext^ context, Type^ sourceType) override
    {
        if (sourceType == String::typeid) 
            return true;
        else 
            return ExpandableObjectConverter::CanConvertFrom(context, sourceType);
    }
};
并使用新型转换器:

[TypeConverter(MyExpandableObjectConverter::typeid)]
public value struct nestedStruct
{
    int z;

    property int Z
    {
        int get()           { return z; }
        void set(int value) { z = value; }
    };
};

值类型的标准行为。让它成为一门解决你问题的课程。@HansPassant:谢谢。它解决了这个问题,但出于许多其他原因,我使用value结构作为更大解决方案的一部分。所以我有必要使用value结构。