Please note there is similar question, which does not answer the lack of CompositeCollection, and accepted answer is horrific: Alternative of CompositeCollection for ComboBox in UWP?
In WPF I could do:
<ComboBox>
<ComboBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding MyData}" />
<!-- add custom XAML to combobox here -->
<ComboBoxItem><Button Command="{Binding Magic}">Clear</Button></ComboBoxItem>
<my:CustomControl/>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
In UWP the only way I found is to define DataTemplateSelector, and add artificial item to my ItemsSource:
<ComboBox>
<ComboBox.ItemTemplateSelector>
<local:CustomTemplateSelector>
<local:CustomTemplateSelector.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"></TextBlock>
</DataTemplate>
</local:CustomTemplateSelector.ItemTemplate>
<local:CustomTemplateSelector.ButtonTemplate>
<DataTemplate>
<Button Content="{Binding}" Command="{Binding Magic}"></Button>
</DataTemplate>
</local:CustomTemplateSelector.ButtonTemplate>
</local:CustomTemplateSelector>
</ComboBox.ItemTemplateSelector>
</ComboBox>
public class CustomTemplateSelector : DataTemplateSelector
{
public DataTemplate ItemTemplate { get; set; }
public DataTemplate ButtonTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return GetDataTemplate(item);
}
protected override DataTemplate SelectTemplateCore(object item)
{
return GetDataTemplate(item);
}
private DataTemplate GetDataTemplate(object item)
{
if (item is IButtonMarkerInterface)
{
return ButtonTemplate;
}
return ItemTemplate;
}
}
// Artificial item which marks buttons for combobox
public interface IButtonMarkerInterface
{
}
// Also You need collection viewSource which wraps observable collection
public class CollectionWrapper : INotifyCollectionChanged
{
public CollectionWrapper(INotifyCollectionChanged wrappedCollection, IEnumerable<object> staticItems)
{
Yadda yadda yadda
You can see at glance why WPF solution was better. Is there better way to do it?