Заполнение свойства коллекции из xaml без указания элемента свойства

У меня есть MarkupExtension

public class DataTemplates : Dictionary<object, DataTemplate>{}

[MarkupExtensionReturnType(typeof(DataTemplateSelector))]
[ContentProperty("DataTemplatesDictionary")]
public class TemplateSelectorExtension : MarkupExtension
{
  //...
  public DataTemplates DataTemplatesDictionary { get; set; }

  public override object ProvideValue(IServiceProvider serviceProvider)
  {
    if (DataTemplatesDictionary == null) throw new ArgumentException();
    // some logic
  }
}

Используйте это в xaml

<TabControl.ItemTemplateSelector>
  <GUI:TemplateSelector>
    <GUI:DataTemplates> <!-- How do I avoid this element???-->

      <DataTemplate ....>
      </DataTemplate>
      <DataTemplate ....>
      </DataTemplate>

    </GUI:DataTemplates>
  </GUI:TemplateSelector>
</TabControl.ItemTemplateSelector>

Вопрос в том, можно ли избежать записи элемента GUI:DataTemplates каким-либо TypeConverter или как-то еще?

Спасибо!

ОБНОВЛЕНИЕ: Я нашел статью MSDN, в которой говорится, что мой пример должен хорошо работать без "GUI:DataTemplates", но это не так:(Также во многих статьях в Интернете говорится то же самое. Что я делаю неправильно?

1 ответ

Решение

Проблема в том, что вы используете словарь, который застревает между двумя противоречивыми требованиями. Вы удалили некоторые ключевые части кода, так что я просто догадываюсь, что там еще, но используя разобранный синтаксис (<GUI:DataTemplates>) вы явно настраиваете словарь в XAML и поэтому можете назначить x:Key атрибуты для каждого, которые будут использоваться в качестве ключей в словаре.

Возвращаясь к использованию ContentProperty, хотя вам все еще нужно назначить ключ для каждого элемента словаря, но XAML не позволит вам объявить x:Key вне словаря и не может идентифицировать неявный, используемый MarkupExtension. Вы также не можете просто оставить ключ DataTemplate полностью выключенным, потому что тогда у словаря нет ключей. Вы могли бы использовать DataType атрибутов в этом случае, но так как у вас в любом случае может быть только один для каждого типа, было бы лучше вообще не использовать селектор, а просто поместить их в ресурсы TabControl и позволить неявной типизации автоматически обрабатывать шаблоны.

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

Другие вопросы по тегам