0

Я хочу использовать HierarchicalDataTemplate с DataTemplateSelector, но я получаю проблемы с заказом: Переслать объявление в XAML, чтобы разрешить циклическую зависимость от DataTemplate

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TemplateA" 
           ItemsSource="{Binding AnySource}" 
           ItemTemplateSelector="{StaticResource MyTemplateSelector}" > 
     <Label Content="A" /> 
    </HierarchicalDataTemplate> 

    <DataTemplate x:Key="TemplateB"> 
     <Label Content="B" /> 
    </DataTemplate> 

    <viewmodel:MyTemplateSelector 
     TemplateA="{StaticResource TemplateA}" 
     TemplateB="{StaticResource TemplateB}" 
     x:Key="MyTemplateSelector" /> 

    <HierarchicalDataTemplate x:Key="TemplateC" 
           ItemsSource="{Binding AnotherSource}" 
           ItemTemplateSelector="{StaticResource MyTemplateSelector}"> 
     <Label Content="C" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 
<Grid> 
    <TreeView 
     ItemsSource="{Binding Source={StaticResource SomeList}}" 
     ItemTemplate="{StaticResource TemplateC}"/> 
</Grid> 

MyTemplateSelector зависит от TemplateA и TemplateA зависит от MyTemplateSelector. Я получаю System.Windows.Markup.XamlParseException во время выполнения. Есть ли способ форвардной декларации в XAML или есть другое решение?

Решение: Я нашел решение: мне не нужно, чтобы установить TemplateSelector в TemplateA, потому что он установлен в родительском DataTemplate. Иногда это может быть так просто ...

+0

должен быть какой-то лучший способ сделать то, что вы пытаетесь сделать ... можете ли вы поделиться, где вы применяете свои шаблоны, и какова структура данных, которую вы хотите связать? – Nitin

+0

Я добавил дополнительную информацию, но я думаю, что они не помогают. Структура данных для привязки сложна, чтобы показать ее здесь простым способом, но я знаю: мне нужен DataTemplateSelector. – user37337

ответ

3

[Кажется, что вы преодолели проблему, не загружая ресурс. Я все равно отправлю ответ будущим читателям]

Вы можете использовать DynamicResource вместо StaticResource.

Это работает только в том случае, если вы заполняете свойство зависимостей, то есть Binding.Converter="{DynamicResource MyConverter}" не будет работать, поскольку Binding.Converter не является свойством зависимостей.

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