Combobox ItemsSource Binding (MVVM) - как я могу сбросить ItemsList

У меня есть поле со списком с ItemsSource, привязанным к ObservableCollection. RadioButton позволяет пользователю выбрать режим. для каждого режима в поле со списком должен быть доступен отдельный список.

Моя проблема с использованием Observablecollection заключается в том, что после инициализации общедоступной observableCollection его можно изменить только с помощью Очистить все и Добавить новый список, элемент за элементом.

Это очень неэффективно и вызывает проблемы с проверками, которые у меня есть для выбранного элемента.

Не могли бы вы предложить другой метод, который позволит мне сбросить источник элементов, чтобы он обновлялся в пользовательском интерфейсе без удаления / добавления?


person yhollander    schedule 21.06.2012    source источник


Ответы (1)


очень простой подход:

class VM
{
  private ObservableCollection mode1;
  private ObservableCollection mode2;

    //view binds to this
  public ObservableCollection<T> X { get; private set; }

    //changing radiobutton invokes this
  public void ChangeMode( mode )
  {
    if( mode == 1 )
      X = mode1;
    else if( mode == 2 )
      X = mode2;
    else
      X = null;
  }
}

не тестировал, но должно работать; если в пользовательском интерфейсе нет обновлений после изменения режима, вы должны вызвать RaisePropertyChanged( ... ) для X, прежде чем ChangeMode вернется. Кроме того, если вы не добавляете / не удаляете список, нет реальной необходимости в ObservableCollection, вместо этого вы можете просто использовать List<T>

person stijn    schedule 21.06.2012
comment
Просто примечание: если вы используете List<T>, Mode на Binding необходимо изменить с OneWay на TwoWay. - person Willem; 21.06.2012
comment
Спасибо. Нет ... не работает. Только инициализация X выполняется. Это правда, мне не нужна наблюдаемая коллекция, я заменил ее на простой список и поднял PropertyChanged после назначения. - person yhollander; 21.06.2012
comment
Также проверим это предложение TwoWay - person yhollander; 21.06.2012
comment
Он действительно работает с TwoWay !!! отличный! ‹BR› Есть идеи, почему, если я нажимаю кнопку раскрывающегося списка, она застревает, если я недостаточно жду, пока список не заполнится заново? - person yhollander; 21.06.2012
comment
обычно существует только один поток пользовательского интерфейса, поэтому, если он обновляет элементы списка bisu, он не может одновременно перерисовывать другие элементы управления - person stijn; 21.06.2012