微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从另一个页面访问ListView?Xamarin表单

如何解决如何从另一个页面访问ListView?Xamarin表单

我想从MainPage修改列表视图的内容。列表视图位于另一个名为LoadResultsPage的页面中。这是调用函数的主页上的按钮:

<Button Text="Load Results" Clicked="FetchData"></Button>

这里是所谓的功能

public async void FetchData(object sender,System.EventArgs e)
    {
        /* string apiUrl = null;
         if (Device.RuntimePlatform == Device.Android)
             apiUrl = "https://10.0.2.2:5001/api";
         else if (Device.RuntimePlatform == Device.iOS)
             apiUrl = "https://localhost:5001/api";
         else
             throw new Exception();*/
        await Navigation.PushAsync(new LoadResultsPage());
        var httpClient = new HttpClient();
        var response = await httpClient.GetStringAsync("http://localhost:5001/api/Calcs");
        var login = JsonConvert.DeserializeObject<List<Calc>>(response);
        Lista.ItemsSource = login;
    }

此处无法识别Lista(位于函数底部),错误为:“名称'Lista'在当前上下文中不存在”

最后这是页面LoadResultsPage的内容,我要修改的列表视图为:

<?xml version="1.0" encoding="utf-8" ?>
  <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Calculator.Views.LoadResultsPage">
<Grid  VerticalOptions="FillAndExpand">
    <ListView x:Name="Lista" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell >
                    <StackLayout >
                        <Label Text="{Binding Id}" TextColor="Black"></Label>
                        <Label Text="{Binding Value}"></Label>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

如何用变量“ login” 中的信息填充两个标签

解决方法

请阅读有关MVVM的信息,我将在全球范围内更改您的概念。在页面之间访问ui元素不是一种最佳样式。

无论如何直接回答您的问题,都需要使用一些静态模型在应用程序内部进行全局数据交换。

    public class Exchange
    {
        private static Exchange _instance;
        public static Exchange Data
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new Exchange();
                }
                return _instance;
            }
        }

        public string Buffer { get; set; }

        public ListView MyListView { get; set; }

    }

示例:Exchange.Data.Buffer可以从任何地方访问。

InitializeComponent();设置之后,用于其页面构造器中的ListView

Exchange.Data.MyListView = Lista;

现在重要的部分是,如果您从另一个页面访问ListView,则必须在UI线程上进行操作。示例:

        Device.BeginInvokeOnMainThread(() =>
        {
            // Update the UI
            Exchange.Data.MyListView.ItemsSource = whatever;
        });
,

名称字段不是公共属性,因此默认情况下无法在页面外部访问。

有两个问题供您选择:

  1. 一旦获得数据(在本例中为“ login”),则只有导航至LoadResultsPage并将登录作为参数传递,并在LoadResultsPage中,您才能访问“ Lista”。

  2. 在LoadResultsPage中设置公共属性,获得“登录”后,将“登录”分配给该属性,并在LoadResultsPage中将Lista.ItemSource设置为该属性。

,

这里建议为 LoadResultsPage 传递 登录数据 ,然后在出现LoadResultsPage时可以显示数据。

例如,如下修改FetchData方法:

public async void FetchData(object sender,System.EventArgs e)
{
    
    var httpClient = new HttpClient();
    var response = await httpClient.GetStringAsync("http://localhost:5001/api/Calcs");
    var login = JsonConvert.DeserializeObject<List<Calc>>(response);
    //Lista.ItemsSource = login;

    await Navigation.PushAsync(new LoadResultsPage(login));
}

然后在 LoadResultsPage.xaml.cs 中:

public partial class DetailPage : ContentPage
{
    public DetailPage(Model login)
    {
        InitializeComponent();
        Lista.ItemsSource = login;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。