Xamarin Forms " ... DisplayAlert не существует в текущем контексте."

Я работаю с Xamarin, все еще новичок в этом, но у меня проблема, что я чувствую, что я не должен быть. Вот моя проблема:

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

}

}

очевидно, у меня есть класс на другой странице под названием "Человек."Этот класс имеет два свойства:" FirstName "и" LastName."Когда я пытаюсь собрать все это вместе, как в Xamarin, я получаю сообщение об ошибке: "имя" DisplayAlert " не существует в текущем контексте."

3 ответов


есть два способа решить эту проблему, и я склоняюсь ко второму. Близко к тому, что сказал Эдвард Л.

DisplayAlert-это метод на Xamarin.Страница Формы... и вы находитесь внутри статического метода, который возвращает эту страницу, значит у вас нет ссылки на него.

Так что вы могли бы сделать это:

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

}
}

что вам действительно нужно сделать, это создать новый класс, который является вашей страницей.

Приложение.КС превращается в это:

using System;
using Xamarin.Forms;

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

}
}
вы создайте новый класс, наследуемый от Page: использование системы; используя Xamarin.Формы;
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 }
            }

        };
    }

}
}

DisplayAlert() метод Page класса.

для того, чтобы ваш класс мог использовать его, он должен либо создать экземпляр Page object и вызвать его с помощью этого объекта или непосредственно наследовать от него.

так как вы заявили, что ваш Person класс на самом деле также является Page класс, вы также можете вызвать его, используя один из ваших Person объекты i.e. personObj.DisplayAlert(...)

возможно, что-то похожее на следующее:

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

это конечно, предполагается, что объявление класса Person выглядит примерно так:

public class Person : Page
{
    ...
}

очевидно, что конкретная реализация будет зависеть от того, как вы структурируете свой код. Я просто иду по тому, что вижу в вашем вопросе, и предполагаю несколько вещей.


или просто попробуйте использовать:

await App.Current.MainPage.DisplayAlert("Alert", "Erreur de connexion", "OK");