更新ObservableCollection绑定到枢轴崩溃的SelectedIndex> = 2(wp7)
我有一个observableCollection绑定到我的UI中的枢轴控件。当我尝试更新集合(清除()项目并重新创建)时,一切正常,除非枢轴控件的selectedIndex大于或等于2.更新ObservableCollection绑定到枢轴崩溃的SelectedIndex> = 2(wp7)
在这种情况下,当我尝试调用Add时遇到ArgumentOutOfRange异常()到可观察集合。这很奇怪。
我试着创建一个新的可观察集合,然后添加()项目,这似乎工作,但我不刷新用户界面,除非我打电话更新函数两次。
什么可能是错的?这是一个错误?
要尝试并保存负载和性能开销,框架只会加载当前显示的透视图和任一侧的透视图。其他项目在显示相邻项目时延迟加载。因此,尝试将SelectedItem设置为尚未加载的项目或页面尚未完全加载完毕时,您可能会遇到问题。
如果您可以分享一些代码来演示您正在尝试执行的操作,我们可能会提供一些更具体的帮助。
如上所述。 Pivot控件经过优化,不会加载所有面板。如果你正在尝试我认为你正在尝试的方法,那么我建议你切换到一个全景控制,它可以使所有PanoramaItems生效。
这是一个已知问题。
不推迟导航/(结合?)来加载的事件是一种解决方法。
你可能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);
}
再次,它不是最大的修复,但它工作正常的和淡入实际上是东西我可能会使用在其他地方。
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
@ johnX99请更新您的问题并提供更多信息。尝试并包含一个演示问题的完整示例。你上面的评论只是提出了更多的问题:你的视图模型的结构是什么?它如何绑定到UI? “ChannelInfoClass”的结构是什么?你在'LoadData()'中做什么?等等 – 2010-12-20 14:58:33