Изменение ItemsSource для ComboBox во время выполнения программы
Есть приложение WPF. В окне имеется два ComboBox'а. При изменении значения в первом ComboBox'e мне нужно изменять значение ItemsSource во втором ComboBox'e в рантайме. Пробовал использовать SelectedItem в первом ComboBox'e и через него менять содержимое коллекции, но данный способ не работает. Подскажите, каким образом можно это реализовать ?
Xaml:
<ComboBox Margin="255,51,312,338" ItemsSource="{Binding FirstComboBoxCollection}" SelectedItem="{Binding FirstComboBoxSelectedItem}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox Margin="255,99,312,290" ItemsSource="{Binding SecondComboBoxCollection}" IsEnabled="{Binding SecondComboBoxIsEnabled}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
ViewModel:
class MainViewModel : INotifyPropertyChanged
{
readonly ApplicationContext db;
public ObservableCollection<string> FirstComboBoxCollection { get; set; }
public ObservableCollection<string> SecondComboBoxCollection { get; set; }
public MainViewModel()
{
db = new ApplicationContext();
FirstComboBoxCollection = CollectionResources.FirstComboBox;
}
private string firstComboBoxSelectedItem;
public string FirstComboBoxSelectedItem
{
get { return firstComboBoxSelectedItem; }
set
{
firstComboBoxSelectedItem = value;
if(firstComboBoxSelectedItem == CollectionResources.games)
{
SecondComboBoxCollection = CollectionResources.SecondComboBoxGames;
SecondComboBoxIsEnabled = true;
}
OnPropertyChanged("FirstComboBoxSelectedItem");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
Ответы (1 шт):
Чтобы ComboBox узнавал о том, что коллекция сменилась на другую, нужно вызывать OnPropertyChanged() при изменении коллекции.
private ObservableCollection<string> _firstComboBoxCollection;
private ObservableCollection<string> _secondComboBoxCollection;
public ObservableCollection<string> SecondComboBoxCollection
{
get => _secondComboBoxCollection;
set
{
_secondComboBoxCollection = value;
OnPropertyChanged();
}
}
public ObservableCollection<string> FirstComboBoxCollection
{
get => _firstComboBoxCollection;
set
{
_firstComboBoxCollection = value;
OnPropertyChanged();
}
}
Фактически, вам не нужно изменять ItemsSource, а только само свойство SecondComboBoxCollection, на которое привязан Binding. Собственно, что вы и делаете, просто ComboBox в вашем случае об этом не узнаёт.