как передать аргумент классу, который наследует UITypeEditor - PullRequest
3 голосов
/ 17 сентября 2011

Я создал редактор для свойства. Однако я хотел бы передать некоторые аргументы конструктору редактора, но я не уверен, как это сделать.

FOO _foo = new foo();
[Editor(typeof(MyEditor), typeof(UITypeEditor))]
public object foo 
 {
 get { return _foo; }
 set {_foo = value;}
 }

~

class MyEditor: UITypeEditor
{
  public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
  {
    //some other code
    return obj;
  }
}

Ответы [ 2 ]

11 голосов
/ 24 марта 2015

Я знаю, что это довольно старая проблема, но я столкнулся с подобной проблемой, и единственный предоставленный ответ не решает ее немного.

Поэтому я решил написать свое собственное решение, которое немного сложнее ибольше похоже на обходной путь, но он точно работает для меня, и, возможно, поможет кому-то.

Вот как это работает.Поскольку вы не создаете экземпляр своей собственной производной UITypeEditor, вы не можете контролировать, какие аргументы передаются конструктору.Что вы можете сделать, это создать другой атрибут и присвоить его тому же свойству, вы назначаете свой собственный UITypeEditor и передаете свои аргументы этому атрибуту, а затем читаете значения из этого атрибута.

[Editor(typeof(MyEditor), typeof(UITypeEditor))]
[MyEditor.Arguments("Argument 1 value", "Argument 2 value")]
public object Foo { get; set; }

class MyEditor : UITypeEditor
{
    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        string property1 = string.Empty, property2 = string.Empty;
        //Get attributes with your arguments. There should be one such attribute.
        var propertyAttributes = context.PropertyDescriptor.Attributes.OfType<ArgumentsAttribute>();
        if (propertyAttributes.Count() > 0)
        {
            var argumentsAttribute = propertyAttributes.First();
            property1 = argumentsAttribute.Property1;
            property2 = argumentsAttribute.Property2;
        }
        //Do something with your properties...
        return obj;
    }

    public class ArgumentsAttribute : Attribute
    {
        public string Property1 { get; private set; }
        public string Property2 { get; private set; }
        public ArgumentsAttribute(string prop1, string prop2)
        {
            Property1 = prop1;
            Property2 = prop2;
        }
    }
}
0 голосов
/ 17 сентября 2011

конечно, вы можете добавить еще один (параметризованный) конструктор в ваш класс myEditor, что-то вроде этого:

public class MyEditor: UITypeEditor
{
  // new parametrized constructor
  public MyEditor(string parameterOne, int parameterTwo...)
  {
    // here your code
  }

  ...
  ...
}

проблема в том, что вы также должны контролировать, кто вызывает этот конструктор, потому что только тогдаможете решить, какой конструктор использовать, и вы можете указать / присвоить значение параметрам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...