我遇到了与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
时会发生这种情况:
Items
已更新
SelectedItem
显然不再是新列表的一部分,
所以ListPicker选择新List的第一项并将其设置为SelectedItem
Items
已包含新列表)SelectedItem
被推送到ViewModel进入SelectedTG
SelectedItem
再次更新SelectedItem
时,Picker会验证它确实是当前Items
集合的一部分。Items
集合再次指向旧的(第一个)List实例。 我不知道,为什么Items Collection会在它已经有新的之后变回旧值
在OnItemsChanged
指向新值的时间和再次使用旧值的时间之间不会调用ListPicker的Items
方法。
如果有人能指出我所缺少的东西,我将非常感激 提前谢谢你 乔治
答案 0 :(得分:0)
我解决了我的问题。 (时间,食物和茶都非常有用,我发现:))
问题是,我在同一个页面的访问之间重用了一个ViewModel实例。 即使之前的访问不再在BackStack上(我再次导航然后再向前转到页面),看起来View仍然存在并且绑定到ViewModel。
发生的事情是,上次访问的ListPicker实例获取了更新的SelectedItem,但还没有获得新的ItemsSource。 这导致了例外。
也许有办法解决这个问题,但我通过不在访问之间重复使用ViewModel解决了这个问题。