Вы можете достичь этого с помощью некоторых умных ElementBinding
с.
Базовый пример:
Допустим, у нас есть простой класс, подобный этому:
public class Country
{
public string Name { get; set; }
public IEnumerable<string> Regions { get; set; }
}
Тогда у нас будет два ComboBox
: один для выбора страны и другой для выбора региона в этой стране.Второй должен обновляться сам при изменении значения первого.
Хорошо, сначала мы должны сказать Silverlight, как отображать Country
.Для сложных сценариев мы могли бы использовать DataTemplate
для этого, но сейчас нам понадобится только свойство DisplayMemberPath
класса ComboBox.
<ComboBox x:Name="cbCountries" DisplayMemberPath="Name"/>
Итак, мы создаем простую коллекцию этих объектовв коде:
var countries = new List<Country>()
{
new Country
{
Name = "USA",
Regions = new List<string>
{
"Texas", "New York", "Florida", ...
},
},
new Country
{
Name = "UK",
Regions = new List<string>
{
"Scotland", "Wales", "England", ...
},
},
...
};
Я знаю, что это не все регионы в странах-примерах, но это пример Silverlight, а не географический урок.
Теперь мынеобходимо установить ItemsSource
из ComboBox
для этой коллекции.
cbCountries.ItemsSource = countries;
Оба они могут быть в конструкторе в коде позади.
Хорошо, теперь вернемся к XAML!
Нам понадобится еще один ComboBox и способ сказать ему, чтобы он динамически получал свои предметы из другой коллекции.
Привязка его ItemsSource
к другому выбранному элементу ComboBox
является наиболее очевидной.способ достижения этого.
<ComboBox x:Name="cbRegion" ItemsSource="{Binding ElementName=cbCountries, Path=SelectedItem.Regions}"/>
Это должно сделать свое дело довольно просто.
Если вы используете MVVM:
Вы можете привязать кItemsSource
из первых ComboBox
из ViewModel
.Остальное остается тем же.
Чтобы определить, какие выбранные значения относятся к ViewModel
, используйте Двусторонние привязки в свойстве SelectedItem
обоих ComboBox
es и привяжите это к любомусвойство, которое вы имеете для него в ViewModel
.
Если ваша коллекция может динамически меняться:
Если список стран (или что-то еще, что вы хотитечтобы использовать его для) может меняться во время выполнения, лучше всего, если вы реализуете INotifyPropertyChanged
для класса Country
и для регионов, используйте ObservableCollection<>
.
Если его не нужно менять во время выполнения, нетнадо возиться с этим.