Истинная альтернатива CompositeCollection для ComboBox в UWP? - PullRequest
1 голос
/ 30 января 2020

Обратите внимание, что есть аналогичный вопрос, который не отвечает отсутствию 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 было лучше. Есть ли лучший способ сделать это?

...