我的UI中有一个observableCollection绑定到一个pivot控件。当我尝试更新集合(clear()项并重新创建)时,除非pivot控件的selectedIndex大于或等于2,否则一切正常。
在这种情况下,当我尝试将Add()调用到observable集合时,我得到一个ArgumentOutOfRange异常。这很奇怪。
我尝试创建一个新的observable集合,然后在那里添加Add()项,这似乎有效,但我不刷新UI,除非我再次调用我的更新函数。
有什么不对?这是一个错误吗?
答案 0 :(得分:1)
这是一个已知问题。
不将导航/(绑定?)推迟到加载的事件是一种解决方法。
答案 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);
}
同样,这不是最好的解决方案,但它可以正常工作,而且淡入实际上是我可能在别处使用的东西。