xamarin.forms - 一个 emptyView 用于加载数据,另一个用于没有可用数据时
问题描述
我有一个使用基于从 API 带来的某些数据显示的 CarouselView 的案例,关键是我需要在下载 API 数据时查看某个视图或至少是文本,以及另一个以防万一没有数据。我尝试使用 RefreshView 和 EmptyView 来实现这一点,但我无法实现所需的行为,我可以让 EmptyView 立即出现数据开始加载,因为那时 ItemSource 为空,然后当数据到达应用程序时,轮播出现,在我看来这很丑陋,理想的做法是在 RefreshView 指示器旁边显示一些视图,显示数据正在加载,然后在没有带来任何数据的情况下显示 API 数据未返回的反馈视图。
我希望我已经让自己被理解了,我希望有人能给我一个关于如何实现这种行为的想法。
我的视图模型:
public MyViewModel()
{
IsRefreshing = true;
Things = new ObservableCollection<Things>();
var t = Task.Run(async () =>
{
await LoadThings();
});
Task.WhenAll(t);
IsRefreshing = false;
}
private async Task LoadThings()
{
Things = new List<Thing>(await App.WebApiManager.GetThingsAsync(Id));
}
我的 IsRefreshing 属性链接到包含我的 CarouselView 的 RefreshView 中的 IsRefreshing 属性
解决方案
我认为您可以使用两个空视图并在刷新状态更改时在它们之间切换,这是代码:
在 XAML 中添加两个内容视图并将默认空视图设置为 LoadingData:
<ContentPage.Resources>
<ContentView x:Key="LoadingData">
<StackLayout>
<Label Text="Loading data..."
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center" />
</StackLayout>
</ContentView>
<ContentView x:Key="NoDataLoaded">
<StackLayout>
<Label Text="No items to display."
Margin="10,25,10,10"
FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Fill"
HorizontalTextAlignment="Center" />
</StackLayout>
</ContentView>
</ContentPage.Resources>
<StackLayout Margin="20">
<RefreshView IsRefreshing="{Binding IsRefreshing}"
Command="{Binding RefreshCommand}">
<CarouselView x:Name="carouselView"
EmptyView="{StaticResource LoadingData}">
... ...
并在代码中相应地显示不同的空视图:
public partial class HorizontalPullToRefreshPage : ContentPage
{
AnimalsViewModel viewModel;
public HorizontalPullToRefreshPage()
{
InitializeComponent();
viewModel = new AnimalsViewModel();
this.BindingContext = viewModel;
viewModel.PropertyChanged += ViewModel_PropertyChanged;
}
private void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName.Equals("IsRefreshing"))
{
if (viewModel.IsRefreshing && viewModel.Animals.Count==0)
{
carouselView.EmptyView = Resources["LoadingData"];
}
else if (!viewModel.IsRefreshing && viewModel.Animals.Count == 0)
{
carouselView.EmptyView = Resources["NoDataLoaded"];
}
}
}
protected override async void OnAppearing()
{
base.OnAppearing();
await Task.Delay(2000);
carouselView.ItemsSource = viewModel.Animals;
}
}
然后,每次属性 IsRefreshing 更改时,您都有机会切换空视图。
希望能帮助到你。
推荐阅读
- javascript - Gitlab JS代码:如果按下某个键,则过早结束实验
- sql - 在 ABAP 中使用一个或多个 IF 语句的 SELECT 查询
- reporting-services - 如何在两个工作日期之间获得以下 SRSS IFF 表达式
- r - 有没有办法在 R Shiny 的 pickerInput 小部件中复制和粘贴值?
- database - 无法使用终端连接到 MongoDB
- javascript - 如何在 404 错误代码上访问响应服务器 - axios
- flutter - 有什么方法可以在颤振应用程序中实现 3D 对象,其中对象上有按钮,以便您可以单击以显示描述?
- optimization - 为什么 scipy.optimize.differential_evolution 不返回最后一个人口?
- javascript - 如何设置从 .json 文件写入 html 表
- c# - 我怎么知道如果
有必要的?