2013-03-15 3 views
0

У меня есть MarkupExtensionЗаполнение сбор имущества от XAML без указания свойства элемента

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 или как-нибудь еще?

спасибо!

UPDATE: Я нашел MSDN article, он утверждает, что мой пример должен работать без «GUI: DataTemplates» хорошо, но это не :( также много статей в состоянии Интернет то же самое, что делать я. Неправильно?

+0

Нет, я не думаю, что это возможно с помощью 'ContentProperty' –

+0

И без ContentProperty это возможно? Я не понимаю ваш комментарий :( –

ответ

0

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

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

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

Смежные вопросы