更新ObservableCollection绑定到枢轴崩溃为SelectedIndex> = 2(wp7)

时间:2010-12-20 13:50:29

标签: windows-phone-7 windows-phone

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

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

我尝试创建一个新的observable集合,然后在那里添加Add()项,这似乎有效,但我不刷新UI,除非我再次调用我的更新函数。

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

5 个答案:

答案 0 :(得分:1)

这是一个已知问题。

Unhandled Exception When Setting Pivot Control SelectedItem/SelectedIndex Property to 3rd Pivot Item (WP7)

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

答案 1 :(得分:1)

你可能已经解决了它,但这就是我所做的。 如前所述,这是一个已知的“错误”/限制。 但是,您可以在页面的Loaded事件中设置SelectedIndex。

见这里: http://christian-helle.blogspot.com/2011/02/working-around-pivot-selectedindex.html

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

答案 2 :(得分:0)

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

如果您可以分享一些代码来展示您尝试做的事情,我们可能会提供一些更具体的帮助。

答案 3 :(得分:0)

如上所述。 Pivot控件经过优化,无法加载所有面板。如果你正在尝试我认为你正在尝试的东西,那么我会建议你切换到全景控制,它会启动所有的PanoramaItems。

答案 4 :(得分:0)

我打算尝试修复@JimmyEngtrö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();
}

现在,为什么故事板?好吧,当你等到加载时,你会看到第一个枢轴,那是蹩脚的。因此,故事板快速淡入...足以掩盖修复。我尝试过设置可见性,但这会让应用程序崩溃。另请注意,出于设计目的,我在透视控件的XAML中将Opacity设置为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<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);
}

同样,这不是最好的解决方案,但它可以正常工作,而且淡入实际上是我可能在别处使用的东西。