2013-03-15 79 views
0

我有一個的MarkupExtension灌裝集合屬性W/O指定屬性元素

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 article,它指出我的例子應該工作沒有「GUI:的DataTemplates」很好,但它並不:( 在互聯網狀態也有許多文章一樣什麼我。做錯了嗎?

+0

不,我不認爲這可能與'ContentProperty' – 2013-03-15 11:22:26

+0

而沒有ContentProperty有可能嗎?我不明白你的評論:( – 2013-03-15 12:24:43

回答

0

問題是你正在使用一個字典讓你在兩個相互衝突的需求之間卡住,你刪除了代碼的一些關鍵部分,所以我只是猜測還有什麼,但是使用了分解語法(<GUI:DataTemplates>)您明確設置了XAML中的Dictionary,因此您可以將每個屬性分配爲x:Key以用作字典中的鍵。

儘管您仍然需要爲每個字典項目指定一個鍵,但回到ContentProperty用法,但XAML不會讓您在字典外聲明x:Key,並且不能識別由MarkupExtension使用的隱式字符。您也不能完全關閉DataTemplate鍵,因爲Dictionary沒有鍵。在這種情況下,您可以使用DataType屬性,但由於無論如何您只能使用一個類型,所以最好不要使用選擇器,只需將它們放在TabControl的資源中,並讓隱式類型自動處理模板。

如果你可以切換到使用普通集合而不是字典,並根據索引或類似的東西做選擇,你將能夠去除額外的元素,但給你最少量的XAML你想要刪除我只是和它一起生活。