C# Xamarin表单“;。。。DisplayAlert在当前上下文中不存在。”;

C# Xamarin表单“;。。。DisplayAlert在当前上下文中不存在。”;,c#,listview,xamarin,C#,Listview,Xamarin,我和Xamarin一起工作,对它还是新手,但我有一个问题,我觉得我不应该这样。我的问题是: using System; using Xamarin.Forms; namespace DataBinding_Lists { public class App { public static Page GetMainPage () { var listView = new ListView { RowHeight = 40 }; listView

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

}
}

显然,我在另一个页面上有一个名为“Person”的类。这个类有两个属性:“FirstName”和“LastName”。当我尝试像在Xamarin中那样将所有这些放在一起时,我得到的错误是:“名称“DisplayAlert”在当前上下文中不存在。”

DisplayAlert()
页面
类的一种方法

为了让类能够使用它,它需要实例化
页面
对象并使用该对象调用它,或者直接从中继承

由于您声明您的
Person
类实际上也是一个
Page
类,因此您还可以使用
Person
对象之一
调用它,即personObj.DisplayAlert(…)

可能与以下类似:

var personObj = new Person();
personObj.DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", "");
public class Person : Page
{
    ...
}
当然,这假设您的Person类声明如下所示:

var personObj = new Person();
personObj.DisplayAlert ("Tapped!", e.SelectedItem + " was tapped.", "OK", "");
public class Person : Page
{
    ...
}

显然,确切的实现将取决于您如何构造代码。我只是根据我在你的问题中看到的情况假设一些事情。

有两种方法可以解决这个问题,我倾向于第二种方法。接近爱德华L.所说的


DisplayAlert
是Xamarin.Forms页面上的一个方法。。。您位于返回该页面的静态方法内部,因此您没有对该页面的引用

所以你可以这样做:

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

}
}
您真正应该做的是创建一个新类,它就是您的页面

您的
App.cs
将变成:

using System;
using Xamarin.Forms;

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

}
}
然后创建一个新类,该类继承自
页面

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

        };
    }

}
}
或者尝试使用:

await App.Current.MainPage.DisplayAlert("Alert", "your message", "OK");

这个错误告诉您Xamarin不知道DisplayAlert是什么。您可能缺少对程序集的引用,或者缺少使用语句的
,或者两者都缺少。DisplayAlert方法由“Xamarin.Forms”使用,如上所述,我使用的是“Xamarin.Forms”。DisplayAlert是由Xamarin和为Xamarin创建的一个方法,所以如果我使用它告诉我的方法,那么我不知道为什么它仍然给我这个错误。()是的,但是它是
Page
类的一个方法(不确定它是静态方法还是成员方法),但是您既不是使用
Page
前缀调用它,也不是您的
App
类继承自
Page
类,因此它无法知道如何调用它。你要么做
Page.DisplayAlert()
(如果是静态方法),要么让你的
App
类从
Page
继承并保持当前的调用方式。我刚刚在中尝试了这两种方法。它们听起来是合法的,似乎应该可以工作,但我尝试了这两种方法,结果都是一样的:“访问非静态成员的Xamarin.Forms.Page.DisplayAlert(string,string,string,string)需要一个对象引用。”'这是否意味着我应该创建一个对象来调用该方法,而不是使用静态方法?是的,因此看起来
DisplayAlert()
是一个成员方法。因此,您可能无法从静态上下文调用它。因此,是的,您必须使用您的一个对象来调用它,请参见答案。我一直在学习Xamarin教程,所以我不得不经历所有这些有点烦人,但您的私有静态页面想法正是我所需要的!谢谢!这对我很有用或者我也是。请注意,从其他线程调用它必须按如下方式进行:Device.BeginInvokeOnMainThread(async()=>wait Application.Current.MainPage.DisplayAlert(“我的警报”、“我的消息”、“确定”);这里提供了最简单的解决方案,不需要引入任何不必要的复杂性