将一组列表绑定到另一个包含列表的对象列表中的组合框

时间:2015-01-08 17:04:02

标签: c# wpf xaml combobox compositecollection

为简单起见,我将使用“汽车制造”和“汽车模型”的概念来解释我的问题。我有一个汽车制造对象列表,每个汽车制造有自己的汽车模型列表。我需要填充一个包含所有汽车模型列表的组合框。我已经研究了这个并且相信CompositeCollection是要走的路,但是,当我不知道我的CarMake列表有多大时,我似乎无法弄清楚如何做到这一点。使用固定长度的CarMake列表,我可以执行以下操作,但我需要它是动态的。

<ComboBox x:Name="carSelectComboBox" DisplayMemberPath="Name">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="CarMake0Collection" 
                              Source="{Binding CarMakes[0].Models}"  />
        <CollectionViewSource x:Key="CarMake1Collection" 
                              Source="{Binding CarMakes[1].Models}" />
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
         <CompositeCollection>
             <CollectionContainer Collection="{Binding Source={StaticResource CarMake0Collection}}" />
             <CollectionContainer Collection="{Binding Source={StaticResource CarMake1Collection}}" />
         </CompositeCollection>
     </ComboBox.ItemsSource>
 </ComboBox>

非常感谢任何帮助。此外,在运行应用程序时,汽车列表以及汽车模型可能会增加/改变,这有可能(甚至可能)。

1 个答案:

答案 0 :(得分:1)

这听起来像转换器的问题,除非你有充分的理由不这样做。

public class CarMakeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        var input = (List<CarMakes>)value;
        return input.SelectMany(carMake=> carMake.Models);
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

后来被用于ComboBox

<ComboBox x:Name="carSelectComboBox"
 ItemsSource="{Binding CarMakes, Converter={StaticResource converter}"
 DisplayMemberPath="Name"/>