Добавление пользовательских значений в ComboBox с помощью CompositeCollection

Я новичок в WPF. У меня есть выпадающий список, который при выборе значения трех других полей (AbbrBlock, MultiBrandSupplier, IgnoreNoCompetition) обновить, чтобы показать правильные соответствующие значения в соответствии с источником данных. Нет проблем с этим.

Проблема возникает, когда я пытаюсь добавить в комбинированный список пользовательское значение, хотя в комбинированном окне все значения отображаются правильно, другие поля не изменяются при изменении значения комбинированного списка.

Вот рабочий код (без дополнительного пользовательского значения в поле со списком - разделен на ключевые части):

<Window.Resources>
    <local:OrdersDataSet x:Key="ordersDataSet" />
    <CollectionViewSource x:Key="caSuppliersViewSource" Source="{Binding CaSuppliers, Source={StaticResource ordersDataSet}}"/>
</Window.Resources>

...

<StackPanel DataContext="{StaticResource caSuppliersViewSource}">
    <ComboBox Name="SupplierDropdown" DisplayMemberPath="SupplierName" 
        ItemsSource="{Binding Source={StaticResource ResourceKey=caSuppliersViewSource}}"/>
    <TextBlock Name="AbbrBlock" VerticalAlignment="Center" Text="{Binding Abbr}"/>
    <CheckBox Name="MultiBrandSupplier" IsChecked="{Binding MultiBrand}"/>
    <CheckBox Name="IgnoreNoCompetition" IsChecked="{Binding IgnoreNoCompetition}"/>
</StackPanel>

Вот код с добавленным пользовательским значением, которое отображается правильно, но другие поля не обновляются при изменении значения в выпадающем списке:

<Window.Resources>
    <local:OrdersDataSet x:Key="ordersDataSet" />
    <CollectionViewSource x:Key="caSuppliersViewSource" Source="{Binding CaSuppliers, Source={StaticResource ordersDataSet}}"/>
</Window.Resources>

...

<StackPanel DataContext="{StaticResource caSuppliersViewSource}">
    <StackPanel.Resources>
        <CompositeCollection x:Key="myCompositeCollection">
            <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=caSuppliersViewSource}}" />
            <ComboBoxItem Content="Add New..." />
        </CompositeCollection>
    </StackPanel.Resources>
    <ComboBox Name="SupplierDropdown" DisplayMemberPath="SupplierName" 
        ItemsSource="{Binding Source={StaticResource myCompositeCollection}}"/>
    <TextBlock Name="AbbrBlock" VerticalAlignment="Center" Text="{Binding Abbr}"/>
    <CheckBox Name="MultiBrandSupplier" IsChecked="{Binding MultiBrand}"/>
    <CheckBox Name="IgnoreNoCompetition" IsChecked="{Binding IgnoreNoCompetition}"/>
</StackPanel>

Что мне здесь не хватает?

1 ответ

Решение

Выглядит как ComboBox обновлял caSuppliersViewSource"s View.CurrentItem свойство (я думаю), чтобы соответствовать его SelectedItem в вашем первом фрагменте. Во втором CollectionViewSource похоронен внутри CompositeCollection так что это больше не происходит. Тем не менее ComboBox все еще выбирает элемент, и вы можете просто привязать к нему, используя ElementName, Нет необходимости устанавливать DataContext на StackPanel с этой версией.

<StackPanel>
    <StackPanel.Resources>
        <CompositeCollection x:Key="myCompositeCollection">
            <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=caSuppliersViewSource}}" />
            <ComboBoxItem Content="Add New..." />
        </CompositeCollection>
    </StackPanel.Resources>
    <ComboBox 
        Name="SupplierDropdown" 
        DisplayMemberPath="SupplierName" 
        ItemsSource="{Binding Source={StaticResource myCompositeCollection}}"
        />
    <TextBlock 
        Name="AbbrBlock" 
        VerticalAlignment="Center" 
        Text="{Binding SelectedItem.Abbr, ElementName=SupplierDropdown}"
        />
    <CheckBox 
        Name="MultiBrandSupplier" 
        IsChecked="{Binding SelectedItem.MultiBrand, ElementName=SupplierDropdown}"
        />
    <CheckBox 
        Name="IgnoreNoCompetition" 
        IsChecked="{Binding SelectedItem.IgnoreNoCompetition, ElementName=SupplierDropdown}"
        />
</StackPanel>

Вы также можете дать своим глазам модель SelectedDBItem свойство того же типа, что и все caSuppliersViewSource содержит и связывает ComboBox.SelectedItem к этому. Тогда вы можете сделать это:

    <TextBlock 
        Name="AbbrBlock" 
        VerticalAlignment="Center" 
        Text="{Binding SelectedDBItem}"
        />

Но это шесть десятков одного, половина другого или что-то еще - если вы не хотите делать что-то еще с SelectedDBItem в вашей модели представления, тогда это удобно.

Другие вопросы по тегам