2010-12-11 9 views
1

In meiner App habe ich mehrere Seiten. Wenn ich auf die Windows "Zurück" -Schaltfläche klicke, geht alles wie erwartet zurück.Windows Phone 7 Zurück Schaltfläche Problem

Allerdings habe ich 2 Seiten, die mir Kummer bereiten. Seite „A“ macht einige Bindung in XAML:

<ListBox x:Name="lbPrograms" ItemsSource="{Binding Items}" SelectionChanged="lbPrograms_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal"> 
        <Image x:Name="ItemImage" Source="/images/ArrowImg.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <StackPanel> 
         <TextBlock x:Name="ItemText" Text="{Binding programName}" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/> 
         <TextBlock x:Name="DetailsText" Text="{Binding createDate}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> 
        </StackPanel> 
        <Image x:Name="ItemFavs" Source="/images/favs.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
        <Image x:Name="ItemDelete" Source="/images/delete.png" Height="43" Width="43" VerticalAlignment="Top" Margin="10,0,20,0"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Der Code hinter für Seite A ist ziemlich einfach:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    // Set the data context of the listbox control to the sample data 
    if (DataContext == null) 
     DataContext = App.ViewModel; 

    App.ViewModel.Refresh(); 
    lbPrograms.ItemsSource = App.ViewModel.Items; 
} 

private void lbPrograms_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/DisplayProgram.xaml?selectedItem=" + lbPrograms.SelectedIndex, UriKind.Relative)); 
} 

private void BackBtn_Click(object sender, EventArgs e) 
{ 
    NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
} 

Seite B keine Bindung in XAML hat, als ich die Daten nehme aus dem ModelView herausziehen und dynamisch auf dem Bildschirm zeichnen. Wie so:

private int index; 
protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 

    string selectedIndex = ""; 
    if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex)) 
    { 
     //prevents error 
     if (int.Parse(selectedIndex) == -1) 
     { 
      return; 
     } 


     if ((DataContext == null)) 
     { 
      index = int.Parse(selectedIndex); 
      App.ViewModel.Refresh(); 
      DataContext = App.ViewModel.Items[index].nValDictionary; 


      int i = 0; 
      foreach (KeyValuePair<string, string> kvp in (((System.Collections.Generic.Dictionary<string, string>)(DataContext)))) 
      { 
       StackPanel sp = new StackPanel(); 
       sp.Name = "sp" + i; 
       sp.Background = new SolidColorBrush(Colors.Black); 
       sp.Width = 460; 

       WrapPanel wp = new WrapPanel(); 
       wp.Name = "test" + i; 
       wp.Width = 300; 
       wp.Height = 200; 


       TextBlock txt = new TextBlock(); 
       txt.Text = kvp.Key.ToString(); 
       txt.Foreground = new SolidColorBrush(Colors.White); 
       sp.Children.Add(txt); 

       int chkBoxesVal = 0; 
       if (kvp.Value == "") 
       { 
        chkBoxesVal = 0; 
       }else{ 
        chkBoxesVal = Convert.ToInt32(kvp.Value.ToString()); 
       } 

       int iCount = 0; 
       for (iCount = 0; iCount <= chkBoxesVal - 1; iCount++) 
       { 
        CheckBox chk = new CheckBox(); 
        chk.Name = i.ToString(); 
        chk.Width = 56; 
        chk.Height = 70; 
        chk.Content = ""; 

        //chk.Background = new SolidColorBrush(Colors.Black); 
        //chk.BorderBrush = new SolidColorBrush(Colors.White); 

        chk.Style = (Style)Application.Current.Resources["checkBoxNG"]; 


        wp.Children.Add(chk); 
       } 

       sp.Children.Add(wp); 

       lbItems.Items.Add(sp); 
       i += 1; 
      } 
     } 
    } 
} 

}

Also, wenn ich werde vorwärts alles funktioniert gut, aber wenn ich die Windows-Hit "Back" -Taste auf Seite B bekomme ich einen Fehler. Ich habe meinen Code durchgegangen und wenn ich den "Zurück" -Knopf drücke, geht es zurück zur Seite A, aber dann geht es auch zur Seite B, die dann den Fehler auslöst und aufhört. Kann mir also jemand sagen, warum dieses Verhalten passiert? Ich würde erwarten, dass es auf Seite A zurückgehen würde und einfach dort aufhören würde. Um nicht zu Seite B zurückzukehren. Gibt es etwas in meinem Code, das dazu führt, dass Seite B neu geladen wird? Alle Ressourcen, die Sie zur Verfügung stellen können, die dieses Verhalten erklären könnten, sind ebenfalls willkommen!

Danke!

Antwort

1

hinzufügen Es ist wie Selection auf Seite A sieht als Ergebnis der Itemssource Initialisierung Brennen Sie in OnNavigatedTo tun.

Sie können überprüfen, ob SelectedIndex -1 ist, bevor Sie eine Aktion im SelectionChanged-Ereignis ausführen.

Alternativ können Sie einen vorhandenen Event-Handler auf SelectionChanged während dieser Initialisierung entfernen und diesen Event-Handler nach Abschluss wiederherstellen.

+0

Das ist im Grunde, was ich getan habe (Überprüfung des SelectedIndex> 0). Vielen Dank! Die ManipulationStarted-Veranstaltung ist faszinierend dank @lukas, daran arbeite ich noch. – webdad3

1

Meine Annahme ist, dass das Ereignis lbPrograms_SelectionChanged auftritt, wenn Sie die Zurück-Taste drücken und die Seite A erneut geladen wird.

Ändern Sie Ihr Navigationsdesign. Für Ihre DataTemplateStackPanel könnten Sie Manipulation Ereignis verwenden und innen

NavigationService.Navigate(new Uri("/DisplayProgram.xaml?selectedItem=" + lbPrograms.SelectedIndex, UriKind.Relative)); 
+0

Sie hatten recht, dass das selectedChanged-Ereignis auf der Zurück-Schaltfläche ausgelöst wurde. Aus irgendeinem Grund wurde der Wert für den lbPrograms.SelectedIndex nicht ausgefüllt, als ich im ManipulationStarted-Ereignis war. Nachdem ich dieses Verhalten ein wenig beobachtet hatte, nahm ich den ManipulationStarted heraus und überprüfte nur, ob SelectedIndex == -1 war. Wenn es nicht war, erlaubte ich es, den Rest der Routine zu durchlaufen. Sonst habe ich es mit einer Rückkehr gestoppt. Es scheint mein Problem gelöst zu haben. Wenn Sie Vorschläge haben, wie Sie den Wert von selectedIndex erhalten können, lassen Sie es mich wissen. – webdad3