Если вам нужен односторонний дисплей, вы можете использовать конвертер:
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();
}
}
Тогда xaml будет выглядеть примерно так:
<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>
Шаблон данных, который вы можете сделать общим, как указано выше. Двухстороннее связывание было бы немного сложнее.
Я думаю, что вам лучше сделать так, чтобы ваши базовые классы реализовали интерфейс ICheckedItem, который предоставляет общие свойства, с которыми вы хотите связать шаблоны данных?