Пользовательское свойство UserControl недоступно - PullRequest
1 голос
/ 24 сентября 2011

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

public partial class QViewer : UserControl
{
    private Shortcuts toolsShortcuts = new Shortcuts();
    private TestProp testProp = new TestProp();

    public Shortcuts ToolsShortcuts { get { return toolsShortcuts; } }
    public TestProp Test { get { return testProp; } }
}


public struct TestProp
{
    public bool DoIt;
    public DateTime Date;
}

public class Shortcuts
{
    Keys toolArrow = Keys.None;
    public Keys Arrow
    {
        get { return toolArrow; }
        set { ... }
    }
}

}

Когда я вставляю свой пользовательский элемент управления в форму (используя другой проект в том же решении) и открываю свойства, оба Ярлыки и Тест отображаются серым цветом, не расширяются, поэтому я не могу установить свойства внутри них.
Что не так?Есть ли лучший способ сгруппировать свойств, чем создание класса или структуры?
Спасибо всем!

1 Ответ

4 голосов
/ 24 сентября 2011

IIRC вам нужно написать TypeConverter , чтобы получить окно свойств для расширения этих свойств.

Предположим, вы используете следующий тип для сложного свойства:

[DescriptionAttribute("Expand to see the spelling options for the application.")]
public class SpellingOptions
{
    private bool spellCheckWhileTyping = true;
    private bool spellCheckCAPS = false;
    private bool suggestCorrections = true;

    [DefaultValueAttribute(true)]
    public bool SpellCheckWhileTyping 
    {
        get { return spellCheckWhileTyping; }
        set { spellCheckWhileTyping = value; }
    }

    [DefaultValueAttribute(false)]
    public bool SpellCheckCAPS 
    {
        get { return spellCheckCAPS; }
        set { spellCheckCAPS = value; }
    }

    [DefaultValueAttribute(true)]
    public bool SuggestCorrections 
    {
        get { return suggestCorrections; }
        set { suggestCorrections = value; }
    }
}

Ваши свойства, вероятно, сейчас выглядят так:

enter image description here

Обратите внимание, что свойство Параметры проверки орфографии недоступно.

Вам необходимо создать TypeConverter, чтобы преобразовать тип объекта, чтобы он мог отображаться правильно..NET Framework предоставляет класс ExpandableObjectConverter , чтобы упростить эту задачу.

Например:

public class SpellingOptionsConverter:ExpandableObjectConverter 
{
    //...
}

Для создания пользовательского TypeConverter необходимо выполнить следующие действия.

Для реализации простого преобразователя типов, который может преобразовать строку в Point

  1. Определить класс, производный от ExpandableObjectConverter (или TypeConverter).
  2. Переопределить метод CanConvertFromэто указывает, какой тип конвертер может конвертировать из.Этот метод перегружен.
  3. Переопределите метод ConvertFrom, который реализует преобразование.Этот метод перегружен.
  4. Переопределите метод CanConvertTo, который указывает, к какому типу конвертер может конвертироваться.Нет необходимости переопределять этот метод для преобразования в строковый тип.Этот метод перегружен.
  5. Переопределите метод ConvertTo, который реализует преобразование.Этот метод перегружен.
  6. Переопределите метод IsValid, который выполняет проверку.Этот метод перегружен.

Посмотрите следующую страницу MSDN для получения дополнительной информации о том, как реализовать TypeConverter:

Как: реализовать преобразователь типов

После того как вы создали TypeConverter, вы можете применить его к своему пользовательскому типу.

[TypeConverterAttribute(typeof(SpellingOptionsConverter)),
 DescriptionAttribute("Expand to see the spelling options for the application.")]
public class SpellingOptions{ ... }

И все будет хорошо:

enter image description here

Я быстро обобщил пример элобарата из MSDN.Здесь вы можете найти полное руководство:

Получение максимальной отдачи от .NET Framework PropertyGrid Control

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