【问题标题】:WPF Master/Detail data binding between 2 combobox2个组合框之间的WPF主/详细数据绑定
【发布时间】:2020-06-05 01:43:53
【问题描述】:

我有两个组合框,其中父必须显示国家列表,子组合必须显示所选国家/地区的城市列表。 数据存储在名为CountriesCitiesListDictionary<Int32, List<String>> 中。 我有以下代码

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

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

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

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    如果您的字典 CountriesCitiesList 包含 Country Id 作为 Key 和 List 作为城市名称,您可以像这样以纯 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 类型键的字典。

    【讨论】:

      【解决方案2】:

      对于父 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" );
      }
      

      【讨论】:

        【解决方案3】:

        --------------主人------ -------

        <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 之间的主细节。

        【讨论】:

          猜你喜欢
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-12
          • 2014-02-03
          • 2011-08-25
          • 1970-01-01
          相关资源
          最近更新 更多