Xamarin - compensation ListView sélection
Je suis en train de travailler avec ce morceau de code
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);
}
}
}
Ce code montre, en réalité, un simple menu Déroulant, à l'aide de la Xamarin Forms technologies.
Je suis en train d'essayer de comprendre comment je pouvais facilement effacer la liste de sélection, après j'ai sélectionné la page que je veux à la tête de!
J'ai trouvé ce bout de code sur Xamarin du site web pour les devs (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
};
Mais je ne peux pas actuellement de comprendre comment je doit l'intégrer à mon code ci-dessus 🙂
D'abord, vous n'aurez pas besoin de séparer ItemSelected événements pour ce faire. Je pense que vous pouvez simplement appeler cette
listview.SelectedItem = null
pour réinitialiser la liste de propriété selecteditem. Que ce soit avant ou après que vous appuyez sur la nouvelle page. Deuxièmement, il pourrait être préférable d'utiliser ItemTapped
pour commencer la page de la transition et de l'utilisation itemselected pour traiter et transmettre les données à la vue suivante.
OriginalL'auteur Guido Magrin | 2014-12-05
Vous devez vous connecter pour publier un commentaire.
Vous assignez la ItemSelected gestionnaire de deux fois, ce qui est une mauvaise idée. Tout ce que vous devez avoir à faire est d'ajouter cette ligne à votre ItemSelected gestionnaire
Si vous ajoutez cette ligne en haut de votre ItemSelected gestionnaire, puis toutes les références ultérieures à SelectedItem va casser, car il est désormais nulle. Essayez de l'ajouter au bas de la gestionnaire, après tous les autres codes de référencement, c'est fait.
Eh bien, si vous regardez la capture d'écran que j'ai, je suis en train de faire ce que vous dites, encore tout s'écroule 🙁
Essayez de vérifier pour SelectedItem != null avant d'entrer dans ce gros bloc if.
OriginalL'auteur Jason
Je voudrais ajouter à la réponse de Jason car il manque une information capitale. Lorsque vous définissez la ListView propriété SelectedItem null, il va déclencher la ItemSelected événement. Donc, si vous n'avez pas un null check, il va lever une exception.
C'est ce à quoi il devrait ressembler à:
OriginalL'auteur Rodolfo De Los Santos
J'ai eu ce même problème, mais les autres solutions n'ont pas fonctionné pour moi. Depuis que j'ai besoin de passer un objet personnalisé à la page suivante j'ai annulé l'élément sélectionné de référence et utilisé l'élément taraudé référence pour mon objet personnalisé.
OriginalL'auteur Kelsey
ListView.SelectedItem n'a pas de setter (je veux dire simple Xamarin Android - pas de Xamarin.Les formes). Je vous suggérons d'utiliser le code suivant:
OriginalL'auteur Alexander S