xamarin.forms - Xamarin Forms ListView不在iOS,HttpClient中显示数据
问题描述
我有一个 Xaml Page ListView,可以在 UWP 中正确显示数据,但在 iOS 中无法正确显示数据。我正在使用 HttpClient 从连接到本地计算机上运行的 SQL Server 的 localhost webapi 获取数据。我认为这与使用 HttpClient 的 NSUrlSession 设置有关。有什么建议么?这是 Xaml 页面。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:telerikDataControls="clr-namespace:Telerik.XamarinForms.DataControls;assembly=Telerik.XamarinForms.DataControls"
xmlns:viewModels="clr-namespace:SxQiApp.ViewModels;assembly=SxQiApp"
xmlns:telerikListView="clr-namespace:Telerik.XamarinForms.DataControls.ListView;assembly=Telerik.XamarinForms.DataControls"
x:Class="SxQiApp.DailyCasePage">
<ContentPage.BindingContext>
<viewModels:VSxCaseViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
<telerikDataControls:RadListView x:Name="listView"
ItemsSource="{Binding SxCases}"
ItemTapped="listView_ItemTappedAsync"
SelectedItem="{Binding SelectedSxCase, Mode=TwoWay}">
<telerikDataControls:RadListView.ItemTemplate>
<DataTemplate>
<telerikListView:ListViewTemplateCell>
<telerikListView:ListViewTemplateCell.View>
<StackLayout>
<Label Text="Surgery Cases" />
<Label Text="{Binding Facesheet}" />
<Label Text="{Binding Record}" />
</StackLayout>
</telerikListView:ListViewTemplateCell.View>
</telerikListView:ListViewTemplateCell>
</DataTemplate>
</telerikDataControls:RadListView.ItemTemplate>
</telerikDataControls:RadListView>
</ContentPage.Content>
</ContentPage>
这是后面的代码。
using System.Threading.Tasks;
using SxQiApp.Models;
using SxQiApp.ViewModels;
using Xamarin.Forms;
namespace SxQiApp
{
// XamlC is set in App.xaml.cs
//[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class DailyCasePage : ContentPage
{
public DailyCasePage()
{
InitializeComponent();
}
private async void listView_ItemTappedAsync(object sender, Telerik.XamarinForms.DataControls.ListView.ItemTapEventArgs e)
{
var sxcase = e.Item as SxCase;
if (sxcase != null)
{
var SxCaseViewModel = new SxCaseViewModel();
if (SxCaseViewModel != null)
{
SxCaseViewModel.SelectedSxCase = sxcase;
await Navigation.PushAsync(new EditSxCasePage(SxCaseViewModel));
}
}
}
}
}
这是视图模型。
using SxQiApp.Models;
using SxQiApp.Services;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
namespace SxQiApp.ViewModels
{
public class VSxCaseViewModel : INotifyPropertyChanged
{
private List<SxCase> _sxcase;
private VSxCaseDataService _vsxCaseDataService = new VSxCaseDataService();
private SxCase _selectedSxCase;
public SxCase SelectedSxCase
{
get { return _selectedSxCase; }
set
{
_selectedSxCase = value;
OnPropertyChanged();
}
}
public List<SxCase> SxCases
{
get
{
return _sxcase;
}
set
{
_sxcase = value;
OnPropertyChanged();
}
}
public ICommand AddRecordCommand => new Command(async () =>
{
await _vsxCaseDataService.PostSxCase(SelectedSxCase);
});
//public ICommand EditSxCaseCommand => new Command(async () =>
//{
// await _vsxCaseDataService.PutSxCase(SelectedSxCase);
//});
public Command EditSxCaseCommand
{
get
{
return new Command(async () =>
{
var sxCaseDataService = new SxCaseDataService();
await sxCaseDataService.PutSxCase(_selectedSxCase.Id, _selectedSxCase);
});
}
}
public VSxCaseViewModel()
{
SelectedSxCase = new SxCase();
GetSxCases();
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private async Task GetSxCases()
{
SxCases = await _vsxCaseDataService.GetSxCases();
}
}
}
这是服务代码
using Newtonsoft.Json;
using SxQiApp.Models;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace SxQiApp.Services
{
class VSxCaseDataService
{
private string Url = "http://localhost:19952/api/vsxcases/";
public async Task<List<SxCase>> GetSxCases()
{
var httpClient = new HttpClient();
var json = await httpClient.GetStringAsync(Url);
var sxcases = JsonConvert.DeserializeObject<List<SxCase>>(json);
return sxcases;
}
public async Task PostSxCase(SxCase sxcase)
{
var httpClient = new HttpClient();
var json = JsonConvert.SerializeObject(sxcase);
StringContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = await httpClient.PostAsync(Url, content);
}
public async Task PutSxCase(int sxcaseid, SxCase selectedSxCase)
{
var httpClient = new HttpClient();
var json = JsonConvert.SerializeObject(selectedSxCase);
StringContent content = new StringContent(json);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = await httpClient.PutAsync(Url + sxcaseid, content);
}
}
}
解决方案
尝试对每个项目进行真正的清理(删除 bin 和 obj 文件夹)并右键单击解决方案并选择清理 {您的解决方案名称}。完成后,再次右键单击解决方案并选择重建{您的解决方案名称}。全部完成后,尝试在 iOS11 模拟器/设备上调试。
如果选项 1 不起作用,也许您可以尝试在完成的启动方法中设置断点,看看是否一切正常。
如果选项 2 不起作用,可能启动画面显示时间更长,您可以减少启动画面的持续时间。
推荐阅读
- swiftui - SwiftUI:KFImage、aspectRatio() 和 layoutPriority()
- spring-boot - 使用 ebextensions 启用 cloudwatch 日志 - SpringBoot
- python - 我如何在 python 中创建一个文本框,当你在其中输入一条消息时,它会替换我的代码中的某些内容,当你按下按钮时它会执行代码
- javascript - javascript:使用递归方法将二叉树值推入数组
- javascript - svg 在 bootstrap 5 popover 中不起作用
- c - 在 OpenGL 中计算立方体上的 UV 映射纹理图集
- android - 反编译 64 位 apk 并使用 32 位支持重新编译
- html - 如何在 SVG 中设置渐变动画?
- python - 让机器人检测不和谐成员丰富的存在
- java - 如何在 Spinner 视图中设置捆绑包值?