我有两个组合框,其中Parent必须显示国家/地区列表,子组合必须显示所选国家/地区的城市列表。
数据存储在Dictionary<Int32, List<String>>
中,其名称为CountriesCitiesList
。
我有以下代码
<ComboBox x:Name="cbCountriesList"
DataContext="{Binding CountriesCitiesList}"
IsSynchronizedWithCurrentItem="true">
</ComboBox>
<ComboBox x:Name="cbCitiesList" VirtualizingStackPanel.IsVirtualizing="True"
ItemsSource="{Binding CountriesCitiesList}"
IsSynchronizedWithCurrentItem="true">
</ComboBox>
问题是,在城市组合中,我无法显示所选国家/地区的城市列表。我觉得这是最后一步。
答案 0 :(得分:6)
如果您的词典CountriesCitiesList
包含国家/地区ID作为键,列表作为城市名称,您可以使用纯xaml方式绑定它 -
<ComboBox x:Name="cbCountriesList"
ItemsSource="{Binding CountriesCitiesList}"
IsSynchronizedWithCurrentItem="True">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Key}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox x:Name="cbCitiesList"
ItemsSource="{Binding SelectedItem.Value, ElementName=cbCountriesList}"
IsSynchronizedWithCurrentItem="True"/>
我假设您要在cbCountriesList中显示国家ID,因为您使用int类型的键将其绑定到字典。
答案 1 :(得分:0)
对于父级ComboBox,将SelectedItem
绑定到模型上的属性:
<ComboBox x:Name="cbCountriesList"
DataContext="{Binding CountriesCitiesList}"
IsSynchronizedWithCurrentItem="true"
ItemSource="{Binding}"
SelectedItem={Binding Path=SomePropertyOnModel} />
SomePropertyOnModel
与国家/地区列表中的项目类型相同。
对于儿童ComboBox,一切都应该是相同的:
<ComboBox x:Name="cbCitiesList" VirtualizingStackPanel.IsVirtualizing="True"
ItemsSource="{Binding CountriesCitiesList}"
IsSynchronizedWithCurrentItem ="true"
ItemSource="{Binding}" />
旁注:您会注意到我特意将ItemsSource绑定添加到两个ComboBox中。
在模型中,每当设置SomePropertyOnModel
时,根据收到的值更新CountriesCitiesList
,即:
private string _somePropertyOnModel;
public string SomePropertyOnModel
{
get { return _somePropertyOnModel; }
set
{
_somePropertyOnModel = value;
// call NotifyPropertyChanged
UpdateCountriesCitiesList();
}
}
private void UpdateCountriesCitiesList()
{
// set CountriesCitiesList based on the
// SomePropertyOnModel value
// CountriesCitiesList should be an ObservableCollection and the values
// should be cleared and then added.
CountriesCitiesList.Clear();
CountriesCitiesList.Add( "Springfield" );
}
答案 2 :(得分:0)
---------------------------- MASTER ------------------ -------
<ComboBox x:Name="CityCB" ItemsSource="{Binding CitiesList}" DisplayMemberPath="CITYNAME" IsSynchronizedWithCurrentItem="True"/>
---------------------------- DETAIL ------------------ -------
<ComboBox x:Name="RegionCB" ItemsSource="{Binding SelectedItem.REGIONS, ElementName=CityCB}" DisplayMemberPath="REGIONNAME" IsSynchronizedWithCurrentItem="True"/>
在这个例子中,我将说明城市与其所包含的区域之间的主要细节。