Dynamically load different UserControls based on object type via data binding in xaml

data-binding, wpf, xaml

Solution

You can use complex user controls in a `DataTemplate`; just declare the `DataTemplate` as your `UserControl`.

Example:

  <Window x:Class="WpfApplication4.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication4"
            Title="MainWindow" Height="300" Width="300" Name="UI" >
        <Window.Resources>
            <DataTemplate DataType="{x:Type local:House}" >
                <local:HouseUserControl DataContext="{Binding}"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:Apartment}">
                 <local:ApartmentUserControl DataContext="{Binding}"/>
            </DataTemplate>
        </Window.Resources>

        <Grid>
            <ListBox ItemsSource="{Binding ElementName=UI, Path=ListOfBuildings}" />
        </Grid>
    </Window>

Problem

Is there some way in WPF to get the same functionality `DataTemplateSelector` gives you, but for UserControls? Say I have a StackView to which I want to bind an IEnumerable of objects. What I'd like to do is somehow have a mapping that, for each object type in the bound IEnumerable, looks at the object type and determines what UserControl to add to the StackView. So, given three classes: ``` public class House : Building{} public class Apartment : Building{} public class Tent : Building{} ``` where each class inherits from `Building` and has its own defined `UserControl`, I'd like to set `DataContext` to an `IEnumerable<Building>` and somehow get the StackView to populate its set of children with the type-specific UserControl. I'd like to do this with as little code behind as possible. The more data binding and XAML duct tape the better.

Original source