Заполнение свойства коллекции из 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, которое вы пытаетесь удалить, я просто живи с этим.