Windows phone 7 正在更新绑定到选定索引透视崩溃的ObservableCollection>;=2(wp7)

Windows phone 7 正在更新绑定到选定索引透视崩溃的ObservableCollection>;=2(wp7),windows-phone-7,windows-phone,Windows Phone 7,Windows Phone,我的UI中有一个绑定到pivot控件的observableCollection。当我尝试更新集合(清除()项并重新创建)时,一切正常,除非pivot控件的selectedIndex大于或等于2 在这种情况下,当我尝试调用Add()到可观察集合时,我得到一个ArgumentOutOfRange异常。这很奇怪 我尝试创建一个新的可观察集合,然后在那里添加()项,这似乎可行,但除非调用两次更新函数,否则我不会刷新UI 有什么不对劲?这是一个错误吗?为了尝试保存加载和性能开销,框架只加载当前显示的轴和两

我的UI中有一个绑定到pivot控件的observableCollection。当我尝试更新集合(清除()项并重新创建)时,一切正常,除非pivot控件的selectedIndex大于或等于2

在这种情况下,当我尝试调用Add()到可观察集合时,我得到一个ArgumentOutOfRange异常。这很奇怪

我尝试创建一个新的可观察集合,然后在那里添加()项,这似乎可行,但除非调用两次更新函数,否则我不会刷新UI


有什么不对劲?这是一个错误吗?

为了尝试保存加载和性能开销,框架只加载当前显示的轴和两侧的轴。当显示相邻项目时,其他项目延迟加载。因此,当您尝试将SelectedItem设置为尚未加载的项目或页面尚未完全加载时,可能会遇到问题


如果您可以共享一些代码来演示您正在尝试的操作,我们可能会提供一些更具体的帮助。

如前所述。枢轴控制经过优化,不会加载所有面板。如果您正在尝试我认为您正在尝试的内容,那么我建议您切换到全景控件,该控件将初始化所有全景项目。

这是一个已知问题


不将导航/(绑定?)延迟到加载的事件是一个解决方法。

您可能已经解决了这个问题,但下面是我所做的。 如前所述,这是一个已知的“bug/”限制。 但是,您可以在页面的已加载事件中设置SelectedIndex

请看这里:


这对我很有帮助,而且现在效果很好=)

我要试试@Jimmy Engtröm建议的修复方法。然而,我也能够通过等待直到负载发生来解决这个问题

<controls:Pivot x:Name="pivotCtrl" Title="{Binding ApplicationTitle}" 
Loaded="OnPivotControlLoaded" Opacity="1">

在页面的代码隐藏中:

private void OnPivotControlLoaded(object sender, RoutedEventArgs e)
{
    // Restore the Pivot control's SelectedIndex
    if (State.ContainsKey(SelectedPivotIndexKey))
    {
        pivotCtrl.SelectedIndex = State.Get<int>(SelectedPivotIndexKey);
    }

    myStoryboard.Begin();
}
private void OnPivotControlLoaded(对象发送方,RoutedEventTargets e)
{
//还原Pivot控件的SelectedIndex
if(State.ContainsKey(SelectedPivotIndexKey))
{
pivotCtrl.SelectedIndex=State.Get(SelectedPivotIndexKey);
}
myStoryboard.Begin();
}
现在,为什么是故事板?好吧,当你等到加载时,你会看到第一个支点,这是跛脚的。所以故事板做了一个快速的淡入…足以掩盖修复。我试着只设置可见性,但那会使应用程序崩溃。还请注意,出于设计目的,我在pivot控件的XAML中将不透明度设置为1。这是故事板:

<Storyboard x:Name="myStoryboard">
    <DoubleAnimation
        Storyboard.TargetName="pivotCtrl"
        Storyboard.TargetProperty="Opacity"
        From="0.0" To="1.0" Duration="0:0:01"
        />
</Storyboard>

以下是助手函数(放置在单独的类文件中并被引用,例如使用MyApp.Helpers,类文件需要引用System.Collections.Generic)

public static T Get(此IDictionary字典,字符串键)
{
返回(T)字典[键];
}
公共静态void AddOrReplace(此IDictionary字典、字符串键、T项)
{
if(字典容器(键))
删除(键);
添加(键、项);
}

同样,这并不是最好的修复方法,但效果很好,而淡入实际上是我在其他地方可能采用的方法。

private void RefreshButton_Click(object sender,EventArgs e){DataContext=null;App.ViewModel.ChannelInfo=new observecollection();App.ViewModel.LoadData();DataContext=App.ViewModel;}@johnX99请用更多信息更新您的问题。尝试并包括一个完整的例子来说明问题。您上面的评论只是提出了更多的问题:viewmodel的结构是什么?它是如何绑定到UI的?
频道信息类的结构是什么?您在
LoadData()中执行什么操作?等
public static T Get<T>(this IDictionary<string, object> dictionary, string key)
{
    return (T)dictionary[key];
}

public static void AddOrReplace<T>(this IDictionary<string, T> dictionary, string key, T item)
{
    if (dictionary.ContainsKey(key))
        dictionary.Remove(key);

    dictionary.Add(key, item);
}