2013-03-15 4 views
0

를 지정하여 i/o는 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> 

질문 : "DataTemplates GUI를"그것은 피할 수있다 어떤 TypeConverter를 쓰는 요소 또는 다른 방법?

감사합니다.

UPDATE : 내가 MSDN article 발견했습니다, 내 예를없이 작동해야한다고 "GUI : DataTemplates는"잘하지만 같은 인터넷 상태 또한 많은 기사를 :(하지 않는 내가 할 무엇. 오류가 발생합니까?

+0

아니요 'ContentProperty'로 가능하지 않다고 생각합니다 –

+0

ContentProperty가 없어도 가능합니까? 나는 당신의 코멘트를 이해하지 못합니다. –

답변

0

문제는 당신이 두 개의 상충되는 요구 사항 사이에 갇혀있는 사전을 사용하고 있다는 것입니다. 코드의 핵심 부분을 제거하여 다른 부분이 무엇인지 추측하고 있지만 분해 된 구문 (<GUI:DataTemplates>)을 사용하면 XAML에서 사전을 명시 적으로 설정하고 있으므로 x:Key 속성을 사전의 키로 사용할 수 있습니다.

각 사전 항목에 대해 키를 할당해야하지만 ContentProperty 사용으로 돌아갈 수는 있지만 XAML에서는 사전에 x:Key을 선언 할 수 없으며 MarkupExtension에서 사용하는 암시 적 코드를 식별 할 수 없습니다. 또한 Dictionary에 키가 없기 때문에 DataTemplate 키를 완전히 끈 상태로 둘 수 없습니다. 이 경우 DataType 특성을 사용할 수 있지만 어쨌든 형식 당 하나만 사용할 수 있으므로 선택기를 사용하지 않고 TabControl 리소스에 넣고 암시 적 입력을 통해 서식 파일을 자동으로 처리하는 것이 좋습니다.

사전 대신 일반 컬렉션을 사용하도록 전환하고 인덱스 또는 기타 요소를 기반으로하는 선택을 수행하면 여분의 요소를 제거 할 수 있지만 제거하려는 XAML의 양이 최소화 될 수 있습니다 나는 그걸로 그냥 살거야.