Коллекция устаревших элементов в ListPicker во время обновления привязки - PullRequest
2 голосов
/ 21 января 2012

У меня проблема с двусторонним связыванием 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 на средстве выбора
  • Эта проверка завершается неудачно, поскольку в этот момент коллекция Items указывает настарый (первый) экземпляр списка снова.

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

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

1 Ответ

0 голосов
/ 22 января 2012

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

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

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

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

...