1

我有两个组合框,父必须显示国家列表,子组合必须显示所选国家的城市列表。数据存储在一个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>

问题是在城市组合中我无法显示所选国家的城市列表。我觉得缺少最后一步。

4

3 回答 3

7

如果您的字典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 类型键的字典。

于 2012-10-13T19:14:21.537 回答
0

对于父 ComboBox,将 绑定SelectedItem到模型上的属性:

<ComboBox x:Name="cbCountriesList" 
    DataContext="{Binding CountriesCitiesList}"
    IsSynchronizedWithCurrentItem="true"
    ItemSource="{Binding}"
    SelectedItem={Binding Path=SomePropertyOnModel} />

WhereSomePropertyOnModel与国家列表中的项目具有相同的类型。

对于子 ComboBox,一切都应该相同:

<ComboBox x:Name="cbCitiesList" VirtualizingStackPanel.IsVirtualizing="True"                  
    ItemsSource="{Binding CountriesCitiesList}"
    IsSynchronizedWithCurrentItem ="true"
    ItemSource="{Binding}" />

旁注:您会注意到我专门将 ItemsSource 绑定添加到两个 ComboBoxes。

在模型中,每当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" );
}
于 2012-10-13T19:00:19.837 回答
0

- - - - - - - - - - - - - - 掌握 - - - - - - - - - - - ----

<ComboBox 
    x:Name="CityCB" 
    ItemsSource="{Binding CitiesList}" 
    DisplayMemberPath="CITYNAME" 
    IsSynchronizedWithCurrentItem="True"/>

- - - - - - - - - - - - - - 细节 - - - - - - - - - - - ----

<ComboBox 
    x:Name="RegionCB" 
    ItemsSource="{Binding SelectedItem.REGIONS, ElementName=CityCB}"
    DisplayMemberPath="REGIONNAME" 
    IsSynchronizedWithCurrentItem="True"/>

在这个例子中,我展示了 City 和它所包含的 Regions 之间的主细节。

于 2016-11-16T19:48:10.687 回答