2010-12-20 81 views
3

我有一個observableCollection綁定到我的UI中的樞軸控件。當我嘗試更新集合(清除()項目並重新創建)時,一切正常,除非樞軸控件的selectedIndex大於或等於2.更新ObservableCollection綁定到樞軸崩潰的SelectedIndex> = 2(wp7)

在這種情況下,當我嘗試調用Add時遇到ArgumentOutOfRange異常()到可觀察集合。這很奇怪。

我試着創建一個新的可觀察集合,然後添加()項目,這似乎工作,但我不刷新用戶界面,除非我打電話更新函數兩次。

什麼可能是錯的?這是一個錯誤?

回答

0

要嘗試並保存負載和性能開銷,框架只會加載當前顯示的透視圖和任一側的透視圖。其他項目在顯示相鄰項目時延遲加載。因此,嘗試將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

0

如上所述。 Pivot控件經過優化,不會加載所有面板。如果你正在嘗試我認爲你正在嘗試的方法,那麼我建議你切換到一個全景控制,它可以使所有PanoramaItems生效。

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

現在,爲什麼故事板?好吧,當你等到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); 
} 

再次,它不是最大的修復,但它工作正常的和淡入實際上是東西我可能會使用在其他地方。