Как объединить два источника в Коллекцию и показать их правильно в выпадающем списке? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть код XAML, который сводит меня с ума. Все началось с добавления фиктивного элемента для значения, на которое нет ссылок.

Для этого мне пришлось реализовать CollectionViewSource и CompositeCollection. Теперь я не могу выбрать первый элемент Combobox, он появляется, но я не могу выбрать его, потому что я установил DisplayMemberPath в XAML (я так думаю). Также разделитель выглядит не так, как ожидалось.

Позвольте мне показать вам:


screenshot


Если я не установлю XAML DisplayMemberPath, я могу использовать Пустышку, но связанные элементы отображаются некорректно:

screenshot

XAML:

<ComboBox x:Name="G_cb_content_zuordnung" 
          Margin="165,0,0,0" 
          Grid.Row="1" 
          SelectedIndex="0"
          VerticalAlignment="Top"
          DisplayMemberPath="PartnerID"
          HorizontalAlignment="Left" 
          Width="119">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="ComboCollection" Source="{Binding Path=mySelectedItem.Stammkinder}" />
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="Ohne Stammnummer" Name="NoPID" />
            <Separator />
            <CollectionContainer Collection="{Binding Source={StaticResource ComboCollection}, Mode=OneWay}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

Все, что мне нужно, это элемент комбинированного списка пустышек / заполнителей, который отображается поверх ObservableCollection<myClass>. Мой образ мышления неправильный? Есть ли более разумное решение? Я что-то упускаю в своем решении?

1 Ответ

0 голосов
/ 03 мая 2018

Используйте ваш второй подход и определите DataTemplate для элементов явно, вместо использования свойства DisplayMemberPath:

<ComboBox xmlns:o="clr-namespace:APP.GLN_Organisator.Objects">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="ComboCollection"
                              Source="{Binding Path=mySelectedItem.Stammkinder}" />

        <!-- Define a DataTemplate here -->
        <DataTemplate DataType="{x:Type o:ChildPartner}">
            <TextBlock Text="{Binding PartnerID}"/>
        </DataTemplate>

    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ComboBoxItem Content="Ohne Stammnummer" Name="NoPID" />
            <Separator />
            <CollectionContainer Collection="{Binding Source={StaticResource ComboCollection}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

С DataTemplate вы сообщаете WPF, как вы хотите отображать свои элементы. Если вы не предоставите DataTemplate и не установите значение свойства DisplayMemberPath, WPF вернется к простому вызову ToString() для отображения ваших элементов. Вот почему вы видите эти строки типа вместо ваших элементов.

...