将一组列表绑定到另一个包含列表的对象列表的组合框
Binding a set of lists to a combobox from another list of objects which contain the lists
为简单起见,我将使用 "car make" 和 "car model" 的概念来解释我的问题。我有一个汽车制造对象列表,每个汽车制造商都有自己的汽车模型列表。我需要填充一个包含所有车型列表的组合框。我对此进行了研究并相信 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>
如有任何帮助,我们将不胜感激。此外,在运行应用程序时,汽车列表以及汽车型号有可能(甚至有可能)grow/change。
这听起来像是转换器的问题,除非您有充分的理由不这样做。
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"/>
为简单起见,我将使用 "car make" 和 "car model" 的概念来解释我的问题。我有一个汽车制造对象列表,每个汽车制造商都有自己的汽车模型列表。我需要填充一个包含所有车型列表的组合框。我对此进行了研究并相信 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>
如有任何帮助,我们将不胜感激。此外,在运行应用程序时,汽车列表以及汽车型号有可能(甚至有可能)grow/change。
这听起来像是转换器的问题,除非您有充分的理由不这样做。
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"/>