Property set isn't being triggered with a UITypeEditor implemented

寵の児 提交于 2019-12-12 10:42:48

问题


I have a property grid that when a button is clicked for one of the properties, certain fields are filled in. However the property's set isn't being triggered. I do not know why.

 private OptoSigmaSettings dataToGet = new OptoSigmaSettings();

 [Editor(typeof(OptoSetupFormEditor), typeof(UITypeEditor))]
 [TypeConverter(typeof(ExpandableObjectConverter))]
 [Category("Setup")]
 public OptoSigmaSettings DataToGet
    {
        get { return dataToGet; }
        set
        {
            MessageBox.Show("Im here"); //This isnt happening.
            dataToGet = value; }
    }

 [Serializable]
public class OptoSigmaSettings
{
    private int duration = 0;
    private string direction = "Positive";
    private string functionToCall = "Home";

    public string FunctionToCall
    {
        get { return functionToCall; }
        set { functionToCall = value; }
    }

    public int Duration
    {
        get { return duration; }
        set { duration = value; }
    }
    public string Direction
    {
        get { return direction; }
        set { direction = value; }
    }
}

public class OptoSetupFormEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        OptoSigmaSettings opto = value as OptoSigmaSettings;

       if (service != null && opto != null)
       {
            using (OptoSigmaSetup form = new OptoSigmaSetup())
            {
                DialogResult result;
                result = service.ShowDialog(form);

                if (result == DialogResult.OK)
                {

                    opto.Direction  = form.Direction;
                    opto.FunctionToCall = form.FunctionToCall;
                    opto.Duration = form.Duration;

                }
            }
      }
        return opto; 
    }
}

This is a WinForms app using the standard property grid.


回答1:


The problem is that your editor returns exactly the same reference (you get opto and you return opto). So even if you modify some internal properties of opto, the opto ref does not change. If you absolutely need to go in your set accessor, inside EditValue create a new OptoSigmaSettings and modify its properties with what your form returns. Note that I don't see in your code how the form is initialized with the content of the existing opto.

PS: I just saw your comment above. Note that if you don't initialize your dataToGet, then it is null, and that's why it works a first time (null is different than the value returned by your form).

Note 2: Marino is right by saying that even if your set is not called, the properties of your object are still updated (Direction, FunctionToCall and Duration).




回答2:


Here was the solution in the end:

 public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        OptoSigmaLinearSettings opto = value as OptoSigmaLinearSettings;
        opto = (OptoSigmaLinearSettings)value;

        if (opto == null)
        {
            opto = new OptoSigmaLinearSettings();
        }

        if (service != null)
        {
            using (OptoSigmaLinearSetup form = new OptoSigmaLinearSetup(opto))
            {
                DialogResult result;
                result = service.ShowDialog(form);

                if (result == DialogResult.OK)
                {
                    opto = form.GeneralSettings;

                }
            }
        }
        return opto;
    }



回答3:


Its been a while since I've used a propertygrid, but here's my 2cents.

Nothing here is setting the DataToGet property on the DataToGet subclass you have created.

In your code:

OptoSigmaSettings opto = value as OptoSigmaSettings;

What looks like is missing is casting value to DataToGet and then setting its DataToGet property:

DataToGet opto = value as DataToGet; opto.DataToGet=myobject;



来源:https://stackoverflow.com/questions/6538293/property-set-isnt-being-triggered-with-a-uitypeeditor-implemented

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!