1

親が国のリストを表示する必要があり、子コンボが選択した国の都市のリストを表示する必要がある 2 つのコンボボックスがあります。データは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"/>

int型のキーで辞書にバインドしているので、cbCountriesListに国IDを表示したいとします。

于 2012-10-13T19:14:21.537 に答える
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}" />

補足: 両方の ComboBox に ItemsSource バインディングを具体的に追加したことに気付くでしょう。

モデルでは、 が設定されるたびに、受け取った値に基づいて を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 に答える