Передача объектов в UITypeEditor - PullRequest
5 голосов
/ 18 июня 2009

В настоящее время я надеюсь использовать PropertyGrid, чтобы позволить пользователям редактировать некоторые из моих классов, однако я столкнулся со стеной, передав объекты в UITypeEditor (ы), которые они используют. Когда пользователь нажимает раскрывающийся список, я хочу показать список уже загруженных текстур на выбор, если они хотят использовать текстуру, которую приложение еще не загрузило, они могут нажать кнопку, чтобы выбрать одну из диалогового окна файла. В случае, если я не имею смысла здесь макет формы:

Dropdown Image.

Моя проблема: Для заполнения списка мне нужен доступ к классу, который управляет списком ресурсов из UITypeEditor.

Теперь я решил эту проблему для своих классов, дав им ссылку на создание их управляющего объекта. В UITypeEditor я затем использую эту ссылку для доступа к тому, что мне нужно. Однако я не могу сделать это для классов, которые я не написал, таких как класс XNA Texture2D.

Вот как выглядят используемые мной классы:

class StaticGeometryChunk
{
    // Geometry data to draw with. Contains a reference to its managing 
    // class for use in its UITypeEditor.
    public GeometryData { get; set; }
    ....
}

class Material
{
    // These are XNA classes. I can't just add a reference to its managing 
    // class (I think?).
    public Texture2D Texture1 { get; set; }
    public Texture2D Texture2 { get; set; }
    ....
}

Я смотрю на свои варианты, и они кажутся:

  1. Сделать управляющие классы статичными.

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

  1. Сделать управляющие занятия синглетонами.

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

  1. Создайте класс-оболочку, который содержит ссылку на управляющий класс и его цель (например, XNA Texture2D).

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

Есть какие-нибудь мысли о вышеупомянутых или других методах передачи того, что мне нужно, в UITypeEditor?

Спасибо за чтение.

Ответы [ 2 ]

9 голосов
/ 18 июня 2009

В методе EditValue вы получаете контекст. Используйте context.Instance для доступа к объекту, который содержит ваше свойство. Этот объект также должен содержать свойство, которое дает вам доступ к списку вещей, которые вы хотите отобразить. Вы можете проверить, если context.Instance, например, ITextureProvider, затем привести его к работе и получить доступ к текстурам Не уверен, имеет ли это смысл в вашем дизайне, но дайте мне знать.

4 голосов
/ 19 мая 2010

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

  1. Создание интерфейса IYourDataProviderService.
  2. Создайте реализацию IYourDataProviderService, которая знает конкретные данные для предоставления.
  3. Создайте класс, реализующий ISite. В методе GetService () возвращает экземпляр класса, который реализует IYourDataProviderService, если параметром serviceType является typeof (IYourDataProviderService) Я оставил остальные методы ISite, выбрасывая NotImplementedException (кроме свойства DesignMode), и для меня это сработало, но, вероятно, это не идеальное решение.
  4. В обработчике события 'Load' присвойте свою реализацию свойству Site вашей таблицы свойств.
  5. Наслаждайтесь!
...