绑定更新期间ListPicker中的陈旧项集合

时间:2012-01-21 15:03:14

标签: windows-phone-7 xaml data-binding silverlight-toolkit

我遇到了与ListPicker的SelectedItem进行双向绑定的问题

在我的View 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,Binding按预期更新。 ListPicker选择第一个Item,然后将其推回SelectedTG。 问题是当我稍后更新AvailableTGs时会发生这种情况:

  • {List}
  • 上的Items已更新
  • SelectedItem显然不再是新列表的一部分, 所以ListPicker选择新List的第一项并将其设置为SelectedItem
    (此时,Picker的Items已包含新列表)
  • 这个新的SelectedItem被推送到ViewModel进入SelectedTG
  • 在那里,提出了一个PropertyChanged通知
  • 这会导致Picker上的SelectedItem再次更新
  • 设置SelectedItem时,Picker会验证它确实是当前Items集合的一部分。
  • 此验证失败,因为此时 Items集合再次指向旧的(第一个)List实例。

我不知道,为什么Items Collection会在它已经有新的之后变回旧值 在OnItemsChanged指向新值的时间和再次使用旧值的时间之间不会调用ListPicker的Items方法。

如果有人能指出我所缺少的东西,我将非常感激 提前谢谢你 乔治

1 个答案:

答案 0 :(得分:0)

我解决了我的问题。 (时间,食物和茶都非常有用,我发现:))

问题是,我在同一个页面的访问之间重用了一个ViewModel实例。 即使之前的访问不再在BackStack上(我再次导航然后再向前转到页面),看起来View仍然存在并且绑定到ViewModel。

发生的事情是,上次访问的ListPicker实例获取了更新的SelectedItem,但还没有获得新的ItemsSource。 这导致了例外。

也许有办法解决这个问题,但我通过不在访问之间重复使用ViewModel解决了这个问题。