2013-06-12 9 views
5

Sto lavorando a un'app di Windows Phone 8. La mia app utilizza ListPicker dal Tookit. Il mio codice in questione sia simile alla seguente:Windows Phone Toolkit ListPicker genera un'eccezione non gestita

<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)) 
    { 

    } 
} 

Ogni volta che il numero totale di elementi supera una certa soglia, la mia app genera uno System.ArgumentException. Lo so, perché ho il seguente codice:

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

il messaggio dice "Valore non rientra nell'intervallo previsto.". Da quello che posso dire, questo succede quando ListPicker deve andare in modalità a schermo intero. Non riesco a capire perché questo succede però.

Qualcuno ha qualche intuizione?

+0

Quanti articoli stai aggiungendo? –

risposta

0

ListPicker ha un numero predefinito di elementi che può essere visualizzato nell'elenco standard. Nelle versioni precedenti del toolkit, è possibile modificare questa soglia, ma da allora l'hanno rimossa.

Tuttavia, poiché il toolkit è open source, puoi sempre fare ciò che ho fatto: andare nel codice sorgente e modificarlo per consentire elenchi più grandi.

+0

Sto bene con ListPicker che entra in modalità a schermo intero. Voglio solo che funzioni. Non riesco a capire perché non funziona però. – user70192

5

Apparentemente, con la modalità a schermo intero non è possibile impostare gli elementi di ListPicker su elementi dell'interfaccia utente specifici all'interno della pagina xaml. È necessario associarli o utilizzare i modelli.

Dopo questo problema esatto, ho trovato una spiegazione qui: http://silverlight.codeplex.com/workitem/9412

ListPickerItems sono UIElements, e il ListPicker li rende in conduttrice. Quando ci sono 5 o meno elementi, la modalità espansa si apre sulla pagina corrente e puoi vedere tutti gli elementi nel presentatore. Quando sono presenti 6 o più elementi, l'apertura del selettore di elenchi passa alla modalità completa che apre una nuova pagina. Questa nuova pagina ha una listbox, che ottiene la proprietà degli oggetti impostata sugli oggetti del listpicker. Questo è dove si rompe. Impostando gli elementi della casella di riepilogo sugli elementi del listpicker (in questo caso un elenco di listpickeritems), la casella di riepilogo inserirà quegli UIElements nella sua vista. Ora un singolo listboxitem è incluso in due punti dell'albero visivo.

A causa di questo problema, ListPicker supporta solo il databinding e il template. NON impostare gli elementi di ListPicker su UIElements specifici.

sono riuscito a ottenere il mio soluzione di lavoro facendo qualcosa di simile:

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