使用 CompositeCollection 向 ComboBox 添加自定义值

Adding custom values to ComboBox with CompositeCollection

我是 WPF 新手。 I have a combobox which when choosing a value three other fields (AbbrBlock, MultiBrandSupplier, IgnoreNoCompetition) update along to show the correct relevant values according to the data source.没问题。

当我尝试向组合框添加自定义值时出现问题,虽然组合框正确显示所有值,但其他字段在更改组合框的值时不会改变。

这是工作代码(没有额外的自定义组合框值 - 剥离到关键部分):

<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>

我在这里错过了什么?

看起来 ComboBox 正在更新 caSuppliersViewSourceView.CurrentItem 属性(我认为)以匹配您第一个代码段中的 SelectedItem。在第二个中,CollectionViewSource 被埋在 CompositeCollection 中,这样就不会再发生了。但是,ComboBox 仍在选择一个项目,您可以使用 ElementName 绑定到该项目。此版本无需在 StackPanel 上设置 DataContext

<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 做其他事情,否则它很方便。