One thing that I noticed when using WPF ResourceDictionaries (and something that I couldn’t find anywhere in any kind of documentation) is that the order in which you add items to your ResourceDictionary is important.
So if you have a DataTemplate that refers to another DataTemplate, you’ll have to put the DataTemplate you refer to first(!).
This XAML gives an error at runtime(Notice how the LinkTemplate refers to the LinkActionTemplate):
1: <DataTemplate x:Key="LinkTemplate">
2: <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" MinWidth="106" MinHeight="35"
3: Cursor="Hand" Background="Transparent">
4: <TextBlock Text="{Binding Title}" TextWrapping="Wrap"/>
5: <ItemsControl ItemsSource="{Binding ChildNodes}"
6: ItemTemplate="{StaticResource LinkActionTemplate}"/>
7: </StackPanel>
8: </DataTemplate>
9:
10:
11: <DataTemplate x:Key="LinkActionTemplate">
12: <StackPanel Orientation="Horizontal" Margin="20,2,0,2" MinHeight="22" Cursor="Hand">
13: <Image Source="{Binding IconPath}" />
14: <TextBlock Text="{Binding Title}" >
15: </TextBlock>
16: </StackPanel>
17: </DataTemplate>
18:
19:
This XAML works fine:
1: <DataTemplate x:Key="LinkActionTemplate">
2: <StackPanel Orientation="Horizontal" Margin="20,2,0,2" MinHeight="22" Cursor="Hand">
3: <Image Source="{Binding IconPath}" />
4: <TextBlock Text="{Binding Title}" >
5: </TextBlock>
6: </StackPanel>
7: </DataTemplate>
8:
9:
10: <DataTemplate x:Key="LinkTemplate">
11: <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch" MinWidth="106" MinHeight="35"
12: Cursor="Hand" Background="Transparent">
13: <TextBlock Text="{Binding Title}" TextWrapping="Wrap"/>
14: <ItemsControl ItemsSource="{Binding ChildNodes}"
15: ItemTemplate="{StaticResource LinkActionTemplate}"/>
16: </StackPanel>
17: </DataTemplate>
18: