Problem
I’ve got a collection of IThings and I’d like to create a HierarchicalDataTemplate for a TreeView. The straightforward DataType={x:Type local:IThing} of course doesn’t work, probably because the WPF creators didn’t want to handle the possible ambiguities.
Since this should handle IThings from different sources at the same time, referencing the implementing class is out of question.
Current solution
For now I’m using a ViewModel which proxies IThing through a concrete implementation:
public interface IThing { string SomeString { get; } ObservableCollection<IThing> SomeThings { get; } // many more stuff } public class IThingViewModel { public IThing Thing { get; } public IThingViewModel(IThing it) { this.Thing = it; } } <!-- is never applied --> <HierarchicalDataTemplate DataType='{x:Type local:IThing}'> <!-- is applied, but looks strange --> <HierarchicalDataTemplate DataType='{x:Type local:IThingViewModel}' ItemsSource='{Binding Thing.SomeThings}'> <TextBox Text='{Binding Thing.SomeString}'/> </HierarchicalDataTemplate>
Question
Is there a better (i.e. no proxy) way?
The reason for this is that the default template selector supports only concrete types, not interfaces. You need to create a custom DataTemplateSelector and apply it to the ItemTemplateSelector property of the TreeView. I can’t find the URL where I found an example of it, but hopefully with this info, you can Google it.