两个组合框之间的WPF主/明细数据绑定

时间:2012-10-13 18:42:39

标签: wpf data-binding

我有两个组合框,其中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>

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

3 个答案:

答案 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"/>

在这个例子中,我将说明城市与其所包含的区域之间的主要细节。