Добавление пользовательских значений в 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
в вашей модели представления, тогда это удобно.