使用CompositeCollection向ComboBox添加自定义值

时间:2016-07-12 17:54:21

标签: wpf xaml data-binding combobox compositecollection

我是WPF的新手。我有一个组合框,当选择一个值时,其他三个字段(AbbrBlockMultiBrandSupplierIgnoreNoCompetition)会根据数据源更新以显示正确的相关值。没问题。

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

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

<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 个答案:

答案 0 :(得分:1)

看起来ComboBox正在更新caSuppliersViewSource的{​​{1}}属性(我认为),以便与您的第一个代码段中的View.CurrentItem相匹配。在第二个中,SelectedItem被隐藏在CollectionViewSource内,因此不再发生。但是,CompositeCollection仍在选择项目,您只需使用ComboBox绑定到该项目即可。无需使用此版本在ElementName上设置DataContext

StackPanel

您还可以为eyour viewmodel提供与<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}" /> 做其他事情,那么它很方便。