1

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?

Shadow
  • 2,089
  • 2
  • 23
  • 45
  • To enable multiple collections to be displayed as a single list in ComboBox in UWP like CompositeCollection in WPF, it's better to use DataTemplateSelector to choose what template will display, as you currently do. – Faywang - MSFT Jan 31 '20 at 09:15

0 Answers0