Как установить динамические свойства в пользовательских элементах управления Windows - PullRequest
0 голосов
/ 14 марта 2012

Я создал пользовательский элемент управления, который имеет два свойства

  1. Тип
  2. Параметр

, где Type - перечисления,

public enum Type { XType , YType }

и Parameter относятся к типу String

Теперь мне нужно изменить Parameter на enum. Я уверен, что у каждого Type будет два параметра.

которые XTypeFoo, XTypeBar, YTypeFoo, YTypeBar.

До этого я сохранял Parameter как свойство String. Теперь я создал два enum для этого,

public enum XParameter { XTypeFoo, XTypeBar } and
public enum YParameter { YTypeFoo, YTypeBar }

Теперь мне нужно изменить тип свойства Parameter с string на что-то другое (зависит от Type)

Т.е. если пользователь выбирает Type в качестве XType, тогда Parameter должен иметь значение XParameter, а если YType, то XParameter.

Итак, какой будет базовый тип.

Ответы [ 3 ]

0 голосов
/ 14 марта 2012

Вы не можете наследовать от enums, поэтому вам нужно использовать классы.Либо используйте константы класса, либо «Dummyclass» для каждого значения перечисления:

В обоих случаях вы используете базовый класс:

public class BaseParameter { }

«Dummyclass»:

public class XParameter : BaseParameter { }
public class YParameter : BaseParameter { }
public class XTypeFoo : XParameter { }
public class XTypebar : XParameter { }
public class YTypeFoo : YParameter { }
public class YTypebar : YParameter { }

Константы:

public class XParameter : BaseParameter
{
    public readonly BaseParameter TypeFoo = new XParameter();
    public readonly BaseParameter TypeBar = new XParameter();
}
public class YParameter : BaseParameter
{
    public readonly BaseParameter TypeFoo = new YParameter();
    public readonly BaseParameter TypeBar = new YParameter();
}

В обоих случаях вы можете использовать IsAssignable для проверки XParameter или YParamter и точного значения value is XTypeFoo или value == XParameter.TypeFoo.

0 голосов
/ 14 марта 2012

Если Type будет перечислением, а Parameter также будет перечислением (хотя допустимые значения будут зависеть от Type), то по существу все возможные значения известны заранее. Так почему бы не использовать одно объединенное перечисление для свойства Parameter и отбросить свойство Type? Например,

public enum ParameterType
{
  XTypeFoo,
  XTypeBar,
  YTypeFoo,
  YTypeBar,
}

Кроме того, вы можете начать спрашивать Parameter об информации о типе. Например,

public interface IParameter
{
   public ParamType GetParamType();
}

public sealed class FooParameter : IParameter
{
  public static readonly FooParameter XParameter = new FooParameter();
  public static readonly FooParameter YParameter = new FooParameter();

  public ParamType GetParamType() { return ParamType.Foo; }

  private FooParameter() { }
}

public sealed class BarParameter : IParameter
{
  public static readonly BarParameter XParameter = new BarParameter();
  public static readonly BarParameter YParameter = new BarParameter();

  public ParamType GetParamType() { return ParamType.Bar; }

  private BarParameter() { }
}

public class MyControl : UserControl
{
   IParameter Parameter {get; set; }

   ...
}
0 голосов
/ 14 марта 2012

Невозможно, и я не думаю, что это необходимо. Лучше переделай свои классы.

Как насчет перечисления с { Foo, Bar } для параметра?

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