Обратите внимание, что есть аналогичный вопрос, который не отвечает отсутствию CompositeCollection, и принятый ответ - это ужас c: Альтернатива CompositeCollection для ComboBox в UWP?
В WPF Я мог бы сделать:
<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>
В UWP я нашел единственный способ определить DataTemplateSelector и добавить искусственный элемент в мой 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
Вы можете сразу увидеть почему решение WPF было лучше. Есть ли лучший способ сделать это?