【问题标题】:Stale Items Collection in ListPicker during Binding Update绑定更新期间 ListPicker 中的陈旧项目集合
【发布时间】:2012-01-21 15:03:14
【问题描述】:

我在双向绑定 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,绑定按预期更新。 ListPicker 选择第一个项目并将其推回SelectedTG。 问题是当我稍后更新AvailableTGs 时会发生这种情况:

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

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

我将非常感谢任何能指出我所缺少的东西的人。
提前感谢
乔治

【问题讨论】:

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


    【解决方案1】:

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

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

    发生的情况是,上一次访问的 ListPicker 实例正在获取更新的 SelectedItem,但尚未获取新的 ItemsSource。 这导致了异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 2015-03-22
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多