如何设置UITypeEditor

时间:2018-03-09 00:51:55

标签: uitypeeditor

我有一个自定义对象的属性要显示在PropertyGrid中:

    [DisplayName("Dirección IP Local")]
    [Editor(typeof(Configuracion.Editors.IPAddressEditor), typeof(UITypeEditor))]
    [Description("Dirección IP del computador en el cual está conectado el dispositivo.")]
    public IPAddress IPLocal { get; set; }

在我所拥有的同一类的构造函数中:

this.IPLocal = Common.Helper.ProgramInfo.GetLocalIPAddresses().FirstOrDefault();

IPAddressEditor是这样的:

public class IPAddressEditor : UITypeEditor
{
    private IWindowsFormsEditorService _editorService;
    private IpAddressInput _ipAddressInput;
    private bool _escKeyPressed;

    public IPAddressEditor()
    {
        _ipAddressInput = new IpAddressInput();
        _ipAddressInput.Width = 150;
        _ipAddressInput.BackgroundStyle.BorderWidth = -1;
        _ipAddressInput.ButtonClear.Visible = true;
        _ipAddressInput.ValueChanged += _ipAddressInput_ValueChanged;
        _ipAddressInput.PreviewKeyDown += _ipAddressInput_PreviewKeyDown;
    }

    void _ipAddressInput_PreviewKeyDown(object sender, System.Windows.Forms.PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
            _escKeyPressed = true;
    }

    void _ipAddressInput_ValueChanged(object sender, EventArgs e)
    {
        if (_editorService != null)
            _editorService.CloseDropDown();
    }

    public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        if (provider != null)
        {
            _editorService =
                provider.GetService(
                typeof(IWindowsFormsEditorService))
                as IWindowsFormsEditorService;
        }

        if (_editorService != null)
        {
            _escKeyPressed = false;

            _editorService.DropDownControl(_ipAddressInput);

            if (!_escKeyPressed)
            {
                IPAddress ip = IPAddress.None;
                if (IPAddress.TryParse(_ipAddressInput.Value, out ip))
                    return ip;
            }
        }

        return value;
    }
}

问题是编辑器中的控件(在本例中为_ipAddressInput)未使用在对象构造函数中指定的值进行初始化。

这很明显,因为在类型编辑器构造函数中我创建了一个新的IpAddressInput实例,所以问题是:初始化它的最佳方法是什么?

我正在考虑为该变量创建一个公共setter并使用TypeDescriptor调用自定义对象的构造函数,但我认为这很棘手,

有更好的解决方案吗?

此致 海梅

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案。

我刚刚添加了

_ipAddressInput.Text = value.ToString();

之前的

_editorService.DropDownControl(_ipAddressInput);

之前我已经考虑过了,但我低估了它,因为我想知道在使用编辑器更新属性时会发生什么,以及它是否会保留修改后的值。这没有问题,编辑器就像一个魅力。