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

问题描述:

我有一个observableCollection绑定到我的UI中的枢轴控件。当我尝试更新集合(清除()项目并重新创建)时,一切正常,除非枢轴控件的selectedIndex大于或等于2.更新ObservableCollection绑定到枢轴崩溃的SelectedIndex> = 2(wp7)

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

我试着创建一个新的可观察集合,然后添加()项目,这似乎工作,但我不刷新用户界面,除非我打电话更新函数两次。

什么可能是错的?这是一个错误?

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

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

+0

private void RefreshButton_Click(object sender,EventArgs e) { DataContext = null; App.ViewModel.ChannelInfo = new ObservableCollection (); App.ViewModel.LoadData(); DataContext = App.ViewModel; } – johnX99 2010-12-20 14:25:20

+0

@ johnX99请更新您的问题并提供更多信息。尝试并包含一个演示问题的完整示例。你上面的评论只是提出了更多的问题:你的视图模型的结构是什么?它如何绑定到UI? “ChannelInfoClass”的结构是什么?你在'LoadData()'中做什么?等等 – 2010-12-20 14:58:33

如上所述。 Pivot控件经过优化,不会加载所有面板。如果你正在尝试我认为你正在尝试的方法,那么我建议你切换到一个全景控制,它可以使所有PanoramaItems生效。

这是一个已知问题。

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

不推迟导航/(结合?)来加载的事件是一种解决方法。

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

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

这帮助了我,现在工作得很好=)

我要去尝试修复提示@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(); 
} 

现在,为什么故事板?好吧,当你等到Load时,你会看到第一个关键点,这是跛脚。所以故事板快速淡入......只是足以掩饰修补程序。我尝试设置可见性,但这会导致应用程序崩溃。另请注意,出于设计目的,我在透视控件的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中。通用)

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); 
} 

再次,它不是最大的修复,但它工作正常的和淡入实际上是东西我可能会使用在其他地方。