How to make a ListBox.ItemTemplate reusable/generic How to make a ListBox.ItemTemplate reusable/generic wpf wpf

How to make a ListBox.ItemTemplate reusable/generic


Create your DataTemplate as a resource and then reference it using the ItemTemplate property of the ListBox. MSDN has a good example

<Windows.Resources>  <DataTemplate x:Key="yourTemplate">    <CheckBox IsChecked="{Binding Path=Checked}" Content="{Binding Path=DisplayName}" />  </DataTemplate>...</Windows.Resources>...<ListBox Name="listBox1"         ItemTemplate="{StaticResource yourTemplate}"/>


The easiest way is probably to put the DataTemplate as a resource somewhere in your application with a TargetType of MyDataItem like this

<DataTemplate DataType="{x:Type MyDataItem}">    <CheckBox IsChecked="{Binding Path=Checked}" Content="{Binding Path=DisplayName}" /></DataTemplate>

You'll probably also have to include an xmlns to your local assembly and reference it through that. Then whenever you use a ListBox (or anything else that uses a MyDataItem in a ContentPresenter or ItemsPresenter) it will use this DataTemplate to display it.


If you wanted one way display then you could use a converter:

class ListConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        return ((IList<MyDataItem>)value).Select(i => new { Checked = i.Checked2, DisplayName = i.DisplayName2 });    }    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        throw new NotImplementedException();    }}

Then the xaml would look something like this:

<Window.Resources>    <this:ListConverter x:Key="ListConverter" /></Window.Resources><ListBox ItemsSource="{Binding Path=Items, Converter={StaticResource ListConverter}}">    <ListBox.ItemTemplate>        <DataTemplate>            <CheckBox IsChecked="{Binding Path=Checked, Mode=OneWay}" Content="{Binding Path=DisplayName, Mode=OneWay}" />        </DataTemplate>    </ListBox.ItemTemplate></ListBox>

That data template you could make generic like above. Two way binding would be a fair bit more difficult.

I think you are better off making your base classes implement a ICheckedItem interface which exposes the generic properties that you want the datatemplates to bind to?