Создавать DataTemplate из кода - очень плохая идея. Во первых это сравнительно сложно, во вторых теряется всякая гибость декларативной разметки, в третьих теряется часть функциональности шаблонов. Да и байндинги в коде для такого создавать это просто перебор...
Вот нормальный подход: ItemsSource листбокса делаешь байндинг к коллекции ObservableCollection; в ресурсах создаешь DataTemplate
<Window x:Class="listbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:someData="clr-namespace:listbox"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<DataTemplate x:Key="CarItemTemplate" DataType="{x:Type someData:SomeData}">
<Border Background="DeepSkyBlue" Width="200" Margin="3" CornerRadius="4">
<Grid>
<TextBlock Text="{Binding Name}" Foreground="White" FontSize="16" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="30"/>
<TextBlock Text="{Binding Count}" Foreground="White" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="3"/>
</Grid>
</Border>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox x:Name="lisbox" DataContext="{Binding}" ItemsSource="{Binding CarCollection}" ItemTemplate="{StaticResource CarItemTemplate}"></ListBox>
</Grid>
</Window>
а вот код бихайнд:
namespace listbox
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<SomeData> CarCollection { get; set; }
public MainWindow()
{
InitializeComponent();
CarCollection = new ObservableCollection<SomeData>{
new SomeData{Name="BMW", Count=20},
new SomeData{Name="Mercedess", Count=30},
new SomeData{Name="Таврия", Count=200}
};
DataContext = this;
}
}
public class SomeData
{
public string Name { get; set; }
public int Count { get; set; }
}
}