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?