Привязка ComboBox WPF на основе данных из другого ComboBox с использованием JSON в C # - PullRequest
0 голосов
/ 04 октября 2019

У меня есть два комбинированных списка, один отображает данные о стране, а второй отображает города.

Я связываю этот комбинированный список, используя десериализованные данные из файла JSON, структурированного таким образом:

[
  {
    "country": "Albania",
    "city": [
          "Elbasan",
          "Petran",
          "Pogradec",
          "Shkoder",
          "Tirana",
          "Ura Vajgurore"     
      ]
  }
]

Десериализация его и извлечение данных следующим образом:

public partial class SomeUCClass: UserControl
{      
    readonly UtilityMethods utilityMethods = new UtilityMethods();

    private string jsonFilePath = @"C:\SomePath\CountryData.json";

    public ObservableCollection<AllCountriesData> countryCityData { get; set; }

    public SomeUCClass()
    {
        InitializeComponent();
        countryCityData = new ObservableCollection<AllCountriesData>();
        DataContext = this;
    }

    private void SomeUCClass_Loaded(object sender, RoutedEventArgs e)
    {
        try
        {
            using (StreamReader streamReader = new StreamReader(jsonFilePath))
            {
                string actualJsonFile = streamReader.ReadToEnd();
                var x = JsonConvert.DeserializeObject<List<AllCountriesData>>(actualJsonFile);
                foreach (var countryCityDataObject in x)
                {
                    countryCityData.Add(new AllCountriesData() { Country = countryCityDataObject.Country, Cities = new ObservableCollection<string>() { countryCityDataObject.MyString.ToString() } });
                }

            }
        }
        catch (Exception ex)
        {
            utilityMethods.ErrorMessage(ex.Message);
        }


    }


  }

public class AllCountriesData
{
  public string Country { get; set; }
  public ObservableCollection<string> Cities { get; set; }
  public string MyString
  {
     get { return Convert.ToString(Cities); }
     set { }
  }
}

Наконец, связывание его с выпадающими списками следующим образом:

<ComboBox x:Name="CmbCountry" 
          ItemsSource="{Binding countryCityData}" 
          DisplayMemberPath="Country"/>

<ComboBox x:Name="CmbCities" 
          ItemsSource="{Binding countryCityData}"
          DisplayMemberPath="Cities"/>

Результатом этого процесса является заполнение поля со списком «Страна», в то время как поле со списком «Город» отображает серию элементов, помеченных (Коллекция).

Вот скриншоты обоих сценариев.

Мне нужно, чтобы в поле со списком "Города" отображались соответствующие города, прикрепленные к"Кантри" комбобокс.

Что / где я делаю / иду не так и как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Свяжите второе ComboBox со свойством Cities SelectedItem первого:

<ComboBox ItemsSource="{Binding SelectedItem.Cities, ElementName=CmbCountry}"/>

Нет необходимости устанавливать DisplayMemberPath здесь, так как CitiesIEnumerable<string>.

2 голосов
/ 04 октября 2019
<ComboBox ItemsSource="{Binding SelectedItem.City, ElementName=CmbCountry}"/>

Или, как правило, у вас будет SelectedCountry на вашей виртуальной машине. например,

<ComboBox ItemsSource="{Binding countryCityData}" 
          DisplayMemberPath="Country" 
          SelectedItem="{Binding SelectedCountry}"/>

<ComboBox ItemsSource="{Binding SelectedCountry.City}" 
          SelectedItem="{Binding SelectedCity}"/>

Ваш AllCountriesData.City будет лучше назван AllCountriesData.Cities, поскольку он представляет собой набор из нескольких городов.

...