2013-06-12 15 views
5

Pracuję w aplikacji Windows Phone 8. Moja aplikacja używa ListPicker z Tookit. Mój kod w pytaniu wygląda tak:Zestaw narzędzi Windows Phone ListPicker wyrzuca nieobsłużony wyjątek

<toolkit:ListPicker x:Name="myListPicker" Margin="12,-6,12,-2" Loaded="myListPicker_Loaded"> 
    <toolkit:ListPicker.Items> 
    <!-- Items are defined here --> 
    </toolkit:ListPicker.Items> 
</toolkit:ListPicker> 


private void myListPicker_Loaded(object sender, RoutedEventArgs e) 
{ 
    if ((myListPicker != null) && (viewModel != null)) 
    { 

    } 
} 

Gdy łączna liczba elementów przekracza pewną wartość progową, moja aplikacja zgłasza System.ArgumentException. Wiem o tym, ponieważ mam następujący kod:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
    { 
     MessageBox.Show(e.ExceptionObject.Message + "\n\nException\n" + e.ExceptionObject.GetType().FullName + "\n" + e.ExceptionObject.StackTrace); 
     if (Debugger.IsAttached) 
     { 
      // An unhandled exception has occurred; break into the debugger 
      Debugger.Break(); 
     } 
    } 

Komunikat mówi "Wartość nie mieści się w oczekiwanym zakresie.". Z tego co wiem, dzieje się tak, gdy ListPicker musi przejść do trybu pełnoekranowego. Nie mogę się domyślić, dlaczego tak się dzieje.

Czy ktoś ma wgląd?

+0

Ile przedmiotów dodajesz? –

Odpowiedz

0

ListPicker ma predefiniowaną liczbę elementów, które może wyświetlić na standardowej liście. W starszych wersjach zestawu narzędzi można zmienić ten próg, ale od tego czasu go usunięto.

Jednakże, ponieważ zestaw narzędzi jest open source, zawsze możesz zrobić to, co zrobiłem - przejdź do kodu źródłowego i zmień go, aby umożliwić większe listy.

+0

Dobrze, że ListPicker przechodzi w tryb pełnoekranowy. Po prostu chcę, żeby to działało. Nie mogę się domyślić, dlaczego to nie działa. – user70192

5

Pozornie, w trybie pełnoekranowym nie można ustawić elementów ListPicker do określonych elementów interfejsu na stronie xaml. Musisz je związać lub użyć szablonów.

Po dokładnie ten problem, znalazłem wyjaśnienie tutaj: http://silverlight.codeplex.com/workitem/9412

ListPickerItems są UIElements i ListPicker czyni je w swojej prezentera. Gdy jest 5 lub mniej elementów, tryb rozszerzony otwiera się na bieżącej stronie i możesz zobaczyć wszystkie elementy w prezenterze. Gdy 6 lub więcej elementów jest obecnych, otwarcie selektora listy przechodzi do trybu pełnego, który otwiera nową stronę. Ta nowa strona ma pole listy, w którym jego właściwość items jest ustawiona na elementy listpicker. To tam się psuje. Ustawiając pozycje listbox na elementy listpicker (w tym przypadku listę listpickeritems), listbox umieszcza te UIElements w swoim widoku. Teraz pojedynczy listboxitem jest zawarty w dwóch miejscach na drzewie wizualnym.

Z tego powodu ListPicker obsługuje tylko wiązanie danych i szablony. NIE ustawiaj elementów ListPicker na konkretne UIElements.

udało mi się dostać mój roztworu roboczego robi coś takiego:

<toolkit:ListPicker x:Name="myListPicker" Margin="12,-6,12,-2" Loaded="myListPicker_Loaded"> 
    <toolkit:ListPicker.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/> 
     </DataTemplate> 
    </toolkit:ListPicker.ItemTemplate> 
    <toolkit:ListPicker.FullModeItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" Tag="{Binding ID}"/> 
     </DataTemplate> 
    </toolkit:ListPicker.FullModeItemTemplate> 
</toolkit:ListPicker> 


private void myListPicker_Loaded(object sender, RoutedEventArgs e) 
{ 
    if ((myListPicker != null) && (viewModel != null)) 
    { 
    myListPicker.ItemsSource = _Data; //_data is an array of objects with 2 properties named ID & Name 
    } 
} 
Powiązane problemy