Коллекция устаревших элементов в ListPicker во время обновления привязки

У меня проблема с двусторонней привязкой SelectedItem ListPicker

В моем представлении XAML у меня есть этот ListPicker:

<toolkit:ListPicker ItemsSource="{Binding AvailableTGs}" 
                    SelectedItem="{Binding SelectedTG, Mode=TwoWay}"/>

И на моей ViewModel:

public IList<Term> AvailableTGs
{
    get
    {
        return _AvailableTGs;
    }
}

private Term _SelectedTG = null;
public Term SelectedTG
{
    get
    {
        return _SelectedTG;
    }
    set
    {             
        this.RaiseAndSetIfChanged(x => x.SelectedTaxGroup, ref _SelectedTG , value);
    }
}

В первый раз я установил AvailableTGs, привязка обновляется, как и ожидалось. ListPicker выбирает первый элемент, и он помещается обратно в SelectedTG. Проблема в том, что когда я позже обновляю AvailableTGs, это происходит:

  • Items обновляются в ListPicker
  • Очевидно, что SelectedItem больше не является частью нового списка, поэтому ListPicker выбирает первый элемент нового списка и устанавливает его как SelectedItem
    (в этот момент Items средства выбора уже содержит новый список)
  • Этот новый SelectedItem помещается в ViewModel в SelectedTG
  • Там возникает уведомление PropertyChanged.
  • Это приводит к тому, что SelectedItem в средстве выбора снова обновляется.
  • При установке SelectedItem средство выбора проверяет, действительно ли оно является частью текущей коллекции Items.
  • Эта проверка не пройдена, так как в этот момент коллекция Items снова указывает на старый (первый) экземпляр List.

Я понятия не имею, почему коллекция элементов должна вернуться к старому значению после того, как в ней уже есть новое.
Метод OnItemsChanged ListPicker НЕ вызывается между моментом, когда Items указывает на новое значение, и временем, когда оно опять старый.

Я был бы очень признателен всем, кто может указать мне, что мне не хватает.
Заранее спасибо
Джордж


person rollingthunder    schedule 21.01.2012    source источник


Ответы (1)


Я решил свою проблему. (Время, еда и чай на удивление полезны, я считаю :) )

Проблема заключалась в том, что я повторно использовал один экземпляр ViewModel между посещениями одной и той же страницы. Несмотря на то, что предыдущее посещение больше не было в BackStack (я перешел назад, а затем снова перешел на страницу), кажется, что представление все еще живо и привязано к модели представления.

Происходило то, что экземпляр ListPicker из предыдущего посещения получал обновленный SelectedItem, но еще не получал новый ItemsSource. Это привело к исключению.

Возможно, есть способ обойти это, но я решил это, НЕ повторно используя мои ViewModels между посещениями.

person rollingthunder    schedule 21.01.2012