2014-12-05 28 views
7

Ich bin eigentlich mit diesem Stück Code arbeitenXamarin - Clearing-Listview-Auswahl

using System; 
using Xamarin.Forms; 
using System.Diagnostics; 

namespace CryptoUI 
{ 
    public class HomePage : Xamarin.Forms.MasterDetailPage 
    { 
     public HomePage() 
     { 
     // Set up the Master, i.e. the Menu 
      Label header = new Label 
      { 
       Text = "MENU", 
       Font = Font.SystemFontOfSize(20, FontAttributes.Bold), 
       HorizontalOptions = LayoutOptions.Center 
      }; 
     // create an array of the Page names 
     string[] myPageNames = { 
      "Main", 
      "Page 2", 
      "Page 3", 
     }; 

     // Create ListView for the Master page. 
     ListView listView = new ListView 
     { 
      ItemsSource = myPageNames, 
     }; 

     // The Master page is actually the Menu page for us 
     this.Master = new ContentPage 
     { 
      Title = "Test", 
      Content = new StackLayout 
      { 
       Children = 
       { 
        header, 
        listView 
       }, 
      } 
     }; 

     // Define a selected handler for the ListView contained in the Master (ie Menu) Page. 
     listView.ItemSelected += (sender, args) => 
     { 
      // Set the BindingContext of the detail page. 
      this.Detail.BindingContext = args.SelectedItem; 

      string currentPage = this.GetType().Name.ToString(); 

      // This is where you would put your “go to one of the selected pages” 
      if(listView.SelectedItem.Equals("Main") && !currentPage.Equals("HomePage")){ 
       AsyncPush(new HomePage()); 
      } 
      else if(listView.SelectedItem.Equals("Page 2") && !currentPage.Equals("SecondPage")){ 
       AsyncPush(new SecondPage()); 
      } 
      else if(listView.SelectedItem.Equals("Page 3") && !currentPage.Equals("ThirdPage")){ 
       AsyncPush(new ThirdPage()); 
      }    

      // Show the detail page. 
      this.IsPresented = false; 
     }; 
      listView.ItemSelected += (senders, e) => { 
       if (e.SelectedItem == null) return; // don't do anything if we just de-selected the row 
       // do something with e.SelectedItem 
       ((ListView)senders).SelectedItem = null; // de-select the row 
      }; 

     // Set up the Detail, i.e the Home or Main page. 
     Label myHomeHeader = new Label 
     { 
      Text = "Home Page", 
      HorizontalOptions = LayoutOptions.Center 
     }; 

     string[] homePageItems = { "Alpha", "Beta", "Gamma" }; 
     ListView myHomeView = new ListView { 
      ItemsSource = homePageItems, 
     }; 

     var myHomePage = new ContentPage(); 

     myHomePage.Content = new StackLayout 
     { 
      Children = 
      { 
       myHomeHeader, 
       myHomeView 
      } , 
     }; 
     this.Detail = myHomePage; 
    } 

     public async void AsyncPush(Page page) 
     { 
      await Navigation.PushAsync(page); 
     } 
    } 
} 

Dieser Code zeigt eigentlich eine einfache Aufklappmenü die Xamarin Forms-Technologien. Ich versuche gerade zu verstehen, wie ich die ListView-Auswahl leicht löschen konnte, nachdem ich die Seite ausgewählt habe, die ich besuchen möchte!

Ich habe dieses Stück Code auf Xamarins Website für Entwickler gefunden (http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/);

listView.ItemSelected += (sender, e) => { 
    if (e.SelectedItem == null) return; // don't do anything if we just de-selected the row 
    // do something with e.SelectedItem 
    ((ListView)sender).SelectedItem = null; // de-select the row 
}; 

Aber ich kann zur Zeit nicht herausfinden, wie ich es mit meinem Code oben dort integrieren sollte :)

+1

Zuerst müssen Sie die ItemSelected-Ereignisse nicht trennen, um dies zu tun. Ich denke, Sie können dieses "listview.SelectedItem = null" einfach aufrufen, um die Eigenschaft listview selecteditem zurückzusetzen. Entweder vor oder nach dem Drücken der neuen Seite. Zweitens könnte es besser sein, 'ItemTapped' zu verwenden, um den Seitenübergang zu starten und das Element zu verwenden, das ausgewählt ist, um die Daten zur nächsten Ansicht zu verarbeiten/zu übergeben. –

Antwort

11

Sie die Zuordnung der itemSelected Handler zweimal, das ist eine schlechte Idee. Alles, was Sie tun müssen, sollten, ist diese Zeile in Ihre bestehende itemSelected Handler

((ListView)sender).SelectedItem = null; 
+0

Danke für die schnelle Antwort! Wie auch immer ich das schon früher probiert habe, alles was ich bekomme ist das: http://1drv.ms/1s0K0cO sobald ich auf irgendein Element im ListView klicke –

+0

Wenn du diese Zeile an den Anfang deines ItemSelected Handlers legst, dann alle Die nachfolgenden Verweise auf SelectedItem werden abgebrochen, da sie jetzt null sind. Fügen Sie es am Ende des Handlers hinzu, nachdem der gesamte Code, der darauf verweist, abgeschlossen ist. – Jason

+0

Nun, wenn Sie sich den Screenshot ansehen, den ich dort verlinkt habe, mache ich das, was Sie sagen, immer noch stürzt alles ab :( –

8

hinzufügen Ich möchte Jason Antwort hinzuzufügen, weil es einige wichtige Informationen vermisst. Wenn Sie die ListView SelectedItem-Eigenschaft auf null festlegen, wird das ItemSelected-Ereignis erneut ausgelöst. Wenn Sie also keine Nullprüfung haben, wird eine Ausnahme ausgelöst. Diese

ist, was es soll wie folgt aussehen:

void ItemSelected(object sender, EventArgs args) 
{ 
    if (((ListView)sender).SelectedItem == null) 
     return; 
    //Do stuff here with the SelectedItem ... 
    ((ListView)sender).SelectedItem = null; 
} 
2

ich das gleiche Problem hatte, aber die anderen Lösungen nicht für mich arbeiten. Da ich ein benutzerdefiniertes Objekt an die nächste Seite übergeben musste, annullierte ich den ausgewählten Objektverweis und verwendete den angetippten Verweis für mein benutzerdefiniertes Objekt.

listView.ItemTapped += async (sender, e) =>{ 

    await Navigation.PushAsync(new DetailPage(e.Item as CustomObject)); 
    ((ListView)sender).SelectedItem = null; 

};