如何解决如何从另一个页面访问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;
});
,
名称字段不是公共属性,因此默认情况下无法在页面外部访问。
有两个问题供您选择:
-
一旦获得数据(在本例中为“ login”),则只有导航至LoadResultsPage并将登录作为参数传递,并在LoadResultsPage中,您才能访问“ Lista”。
-
在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 举报,一经查实,本站将立刻删除。