Вопрос:
В моем главном окне у меня есть класс, в котором хранятся все мои данные (например, “Measconsettings”). Этот класс (“Measconsettings”) содержит ObservableCollection “DeviceDefinitionList” другого класса “DeviceDefinition”,
ObservableCollection<DeviceDefinition> DeviceDefinitionList.
Когда я нажимаю кнопку в моем MainWindow, новое окно создается с помощью datacontex = Measconsettings.
В этом новом окне есть combobox, который ItemsSource привязан к “Measconsettings.DeviceDefinitionList”.
<ComboBox Grid.Row=»2″ Grid.Column=»2″ Margin=»2,0″ Name=»CboDeviceDefinitionList» ItemsSource=»{Binding Path=DeviceDefinitionList}»/>
Моя проблема в том, что combobox не обновляется автоматически при добавлении элемента.
Мне нужно закрыть новое окно и снова нажать кнопку, чтобы открыть его, и только затем он показывает элементы в выпадающем списке.
Я попытался добавить CboDeviceDefinitionList.Items.Refresh(); Но это не работает..
Только когда я добавляю CboDeviceDefinitionList.ItemsSource = orgMeasConSettings.DeviceDefinitionList; сразу после добавления элементов в ObservableCollection, они сразу появляются.
Любые идеи или советы о том, как правильно привязать к combobox? PS: Я начинаю wpf
Лучший ответ:
Это мое решение после внедрения INotifyPropertyChanged, как было предложено manish.
EDIT: Теперь это работает!
public class MeasConSettings : INotifyPropertyChanged { private ObservableCollection<DeviceDefinition> mDeviceDefinitionList; private DeviceDefinition mSelectedDeviceDefinition; public ObservableCollection<DeviceDefinition> DeviceDefinitionList { get { return mDeviceDefinitionList; } set { mDeviceDefinitionList = value; } } public DeviceDefinition SelectedDeviceDefinition { get { return mSelectedDeviceDefinition; } set { mSelectedDeviceDefinition = value; NotifyPropertyChanged(«SelectedDeviceDefinition»); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string property) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(property)); } } }
КОД XAML:
<ComboBox Grid.Row=»2″ Grid.Column=»2″ Margin=»2,0″ Name=»CboDeviceDefinitionList» ItemsSource=»{Binding Path=DeviceDefinitionList}» SelectedItem=»{Binding Path=SelectedDeviceDefinition}»/>
КОД для добавления элемента:
orgMeasConSettings.DeviceDefinitionList.Clear(); foreach (DeviceDefinition deviceDefinition in newSettings.DeviceDefinitionList) { orgMeasConSettings.DeviceDefinitionList.Add(deviceDefinition); } orgMeasConSettings.SelectedDeviceDefinition = newSettings.DeviceDefinitionList.FirstOrDefault();