Можно сделать шаблоны DataTemplate, которые изменят шаблон нужного типа:
<Window x:Class="TestApp.MainWindow"
xmlns:testApp="clr-namespace:TestApp"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type testApp:TestInt}">
<TextBlock Text="{Binding Value}" Background="Red"/>
</DataTemplate>
<DataTemplate DataType="{x:Type testApp:TestStr}">
<TextBlock Text="{Binding Value}" Background="Yellow"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ContentControl Content="{Binding Test1}"/>
<ContentControl Content="{Binding Test2}"/>
<ListBox ItemsSource="{Binding TestList}"/>
</StackPanel>
</Window>
public class TestInt
{
public int Value { get; set; }
}
public class TestStr
{
public string Value { get; set; }
}
public partial class MainWindow : Window
{
public TestInt Test1 { get; set; }
public TestStr Test2 { get; set; }
public List<object> TestList { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Test1 = new TestInt { Value = 123 };
Test2 = new TestStr { Value = "asd" };
TestList = new List<object> { Test1, Test2 };
}
Чтобы даташаблоны автоматически подключались, тип нужно указывать через DataType="{x:Type testApp:TestInt}", а не через DataType="testApp:TestInt"