2014-12-16 13 views
7

Sto lavorando con Xamarin, ancora nuovo, ma ho un problema che ho la sensazione che non dovrei esserlo. Ecco il mio problema:Form Xamarin "... DisplayAlert non esiste nel contesto corrente."

using System; 
using Xamarin.Forms; 

namespace DataBinding_Lists 
{ 
public class App 
{ 
    public static Page GetMainPage() 
    { 
     var listView = new ListView { RowHeight = 40 }; 
     listView.ItemsSource = new Person [] 
     { 
      new Person { FirstName = "Abe", LastName = "Lincoln" }, 
      new Person { FirstName = "Groucho", LastName = "Marks" }, 
      new Person { FirstName = "Carl", LastName = "Marks" }, 
     }; 

     listView.ItemTemplate = new DataTemplate(typeof(TextCell)); 
     listView.ItemTemplate.SetBinding(TextCell.TextProperty, "FirstName"); 
     listView.ItemSelected += async (sender, e) => { 
      await DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", ""); 
     }; 

     return new ContentPage { 
      Content = new StackLayout 
      { 
       Padding = new Thickness (5,20,5,5), 
       Spacing = 10, 
       Children = { listView } 
      } 
     }; 
    } 

} 

}

Ovviamente, ho una classe su un'altra pagina chiamata "Persona". Questa classe ha due proprietà: "FirstName" e "LastName". Quando provo a mettere tutto questo insieme così in Xamarin, ottengo l'errore dicendo: "Il nome 'DisplayAlert' non esiste nel contesto corrente."

+0

Questo errore ti sta dicendo che Xamarin non sa cosa sia DisplayAlert. Probabilmente ti manca un riferimento a un assembly, manca un'istruzione 'using' o entrambe le cose. –

+0

Il metodo _DisplayAlert_ viene utilizzato da "Xamarin.Forms", che, come detto sopra, sto usando. DisplayAlert è un metodo creato da e per Xamarin, quindi se sto usando quello che mi dice, allora non so perché continua a darmi questo errore. (http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/pop-ups/) – prinsJoe

+1

Sì, ma è un metodo della classe 'Page' (non sicuro se è statico o metodo membro), ma non lo chiami usando il prefisso 'Page' né la tua classe' App' eredita dalla classe 'Page', quindi non ha modo di sapere come chiamarla.Devi fare 'Page.DisplayAlert()' (se si tratta di un metodo statico) o rendere la tua classe 'App' ereditata da' Page' e mantenere il modo attuale di chiamare. –

risposta

6

Ci sono due modi per risolvere questo e mi propongo verso il secondo. Vicino a ciò che Edward L. ha detto.

DisplayAlert è un metodo in una pagina Xamarin.Forms ... e ci si trova all'interno di un metodo statico che restituisce tale pagina, quindi non si ha alcun riferimento ad esso.

Così si potrebbe fare questo:

using System; 
using Xamarin.Forms; 

namespace DataBinding_Lists 
{ 
public class App 
{ 
    private static Page page; 
    public static Page GetMainPage() 
    { 
     var listView = new ListView { RowHeight = 40 }; 
     listView.ItemsSource = new Person [] 
     { 
      new Person { FirstName = "Abe", LastName = "Lincoln" }, 
      new Person { FirstName = "Groucho", LastName = "Marks" }, 
      new Person { FirstName = "Carl", LastName = "Marks" }, 
     }; 

     listView.ItemTemplate = new DataTemplate(typeof(TextCell)); 
     listView.ItemTemplate.SetBinding(TextCell.TextProperty, "FirstName"); 
     listView.ItemSelected += async (sender, e) => { 
      await page.DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", ""); 
     }; 

     page = new ContentPage { 
      Content = new StackLayout 
      { 
       Padding = new Thickness (5,20,5,5), 
       Spacing = 10, 
       Children = { listView } 
      } 

     }; 
     return page; 
    } 

} 
} 

Che cosa si dovrebbe davvero fare è creare una nuova classe che è la tua pagina.

tuo App.cs si trasforma in questo:

using System; 
using Xamarin.Forms; 

namespace DataBinding_Lists 
{ 
public class App 
{ 
    public static Page GetMainPage() 
    { 
     return new PeoplePage(); 
    } 

} 
} 

Poi si crea una nuova classe che eredita da Pagina: using System; utilizzando Xamarin.Forms;

namespace DataBinding_Lists 
{ 
public class PeoplePage : Page 
{ 
    public PeoplePage() 
    { 
     var listView = new ListView { RowHeight = 40 }; 
     listView.ItemsSource = new Person [] 
     { 
      new Person { FirstName = "Abe", LastName = "Lincoln" }, 
      new Person { FirstName = "Groucho", LastName = "Marks" }, 
      new Person { FirstName = "Carl", LastName = "Marks" }, 
     }; 

     listView.ItemTemplate = new DataTemplate(typeof(TextCell)); 
     listView.ItemTemplate.SetBinding(TextCell.TextProperty, "FirstName"); 
     listView.ItemSelected += async (sender, e) => { 
      await DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", ""); 
     }; 

     Content = new ContentPage { 
      Content = new StackLayout 
      { 
       Padding = new Thickness (5,20,5,5), 
       Spacing = 10, 
       Children = { listView } 
      } 

     }; 
    } 

} 
} 
+0

Ho lavorato direttamente ai tutorial di Xamarin, quindi era un po 'fastidioso che io ho dovuto esaminare tutto questo, ma tu, pagina privata, pagina page_idea era esattamente ciò di cui avevo bisogno! Grazie! – prinsJoe

4

DisplayAlert() è un metodo della classe Page.

Affinché la classe sia in grado di utilizzarlo, è necessario creare un'istanza di un oggetto Page e invocarlo utilizzando tale oggetto o ereditarlo direttamente da esso.

Dal momento che lei ha affermato che la classe Person è in realtà anche una classe Page, si potrebbe anche invocare utilizzando una delle tue Person oggetti i.e. personObj.DisplayAlert(...)

Forse qualcosa di simile al seguente:

var personObj = new Person(); 
personObj.DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", ""); 

Questo, Naturalmente, si presuppone che la dichiarazione della classe Persona sia simile alla seguente:

public class Person : Page 
{ 
    ... 
} 

Ovviamente, l'implementazione esatta dipenderà dal modo in cui si struttura il codice. Sto solo passando per quello che posso vedere nella tua domanda e assumendo alcune cose.

Problemi correlati