При бидинге коллекции к ItemsControl создаётся CollectionView (для IEnumerable, для IList - ListCollectionView), который может дополнительно отсортировать или отфильтровать коллекцию. Элементы, видимые на экране, берутся из этого CollectionView, а не из оригинальной коллекции.
ListCollectionView имеет проперти NewItemPlaceholderPosition, с помощью которого можно добавить фейковый элемент в начало или конец.
// CollectionView можно получить двумя способами:
// 1. Просто получить дефолтный вариант для коллекции
var collectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
// 2. Создать свой, тогда именно этот созданный collectionView надо передавать для биндинга в ItemsSource.
var collectionView = new ListCollectionView(Models);
// После, можно добавить фейковый элемент
collectionView.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
После этого в ListBox появится элемент CollectionView.NewItemPlaceholder, который можно отдельно стилизовать с помощью DataTemplateSelector.
DataTemplateSelectorpublic sealed class NewItemTemplateSelector : DataTemplateSelector
{
public DataTemplate ItemTemplate { get; set; }
public DataTemplate NewItemPlaceholderTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == CollectionView.NewItemPlaceholder)
return NewItemPlaceholderTemplate;
return ItemTemplate;
}
}
<ListBox.ItemTemplateSelector>
<t:NewItemTemplateSelector>
<t:NewItemTemplateSelector.ItemTemplate>
<DataTemplate>
<!-- Шаблон обычного элемента -->
</DataTemplate>
</t:NewItemTemplateSelector.ItemTemplate>
<t:NewItemTemplateSelector.NewItemPlaceholderTemplate>
<DataTemplate>
<!-- Шаблон CollectionView.NewItemPlaceholder -->
<Button Content="+" />
</DataTemplate>
</t:NewItemTemplateSelector.NewItemPlaceholderTemplate>
</t:NewItemTemplateSelector>
</ListBox.ItemTemplateSelector>