我不确定这是否是您的问题,但我会检查几件事:
- 您可以不在 XAML 中设置绑定,而是在加载数据后的代码中设置。
- 您可能需要将 BindingContext 设置为
products(如果尚未这样做的话)。
- 另外,最好将标签的绑定路径设置为集合的
Count 属性。
- 最后,在 XAML 中将
IsVisible 设置为 false(默认)。此硬代码将被加载数据时设置的绑定覆盖。
无论如何,我制定了一个完成这项工作的最小完整工作示例。
它的基本工作方式如下:应用程序启动并没有显示任何内容......然后继续加载数据。加载数据时出现标签,显示集合中的项目数。 工具栏中还有两个按钮:添加项目和删除项目。如果您删除所有项目,则会出现No data found 标签。
查看代码中的 cmets
Page1.xaml.cs
using System;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace scrollviewPrompt
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class Page1 : ContentPage
{
// products is an observable collection so that
// it notifies when it changes.
public ObservableCollection<string> products { get; set; }
public Page1()
{
InitializeComponent();
}
protected override async void OnAppearing()
{
// Initialize your products collection
products = new ObservableCollection<string>();
// Set binding context of the whole Page1
// to your products collection
BindingContext = products;
// Load data asynchronously.
// At this point the data is already bound to
// our collection, so when data is loaded
// "No data found" label will dissapear.
await LoadDataAsync();
base.OnAppearing();
}
private async Task LoadDataAsync()
{
await Task.Delay(4000);
products.Add("Toks");
noDataLabel.SetBinding(Label.IsVisibleProperty, new Binding()
{
Path="Count",
Converter = new EmptyCollectionToBoolConverter()
});
}
// Add items to collection.
private void AddClicked(object sender, EventArgs e)
{
products.Add("locs");
}
// If collection not empty, remove first item.
private void RemoveClicked(object sender, EventArgs e)
{
if (products.Count>0)
products.RemoveAt(0);
}
}
public class EmptyCollectionToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var count = (int)value;
return count==0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class Not_EmptyCollectionToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var count = (int)value;
return count > 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
Page1.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:local="clr-namespace:scrollviewPrompt"
x:Class="scrollviewPrompt.Page1">
<ContentPage.Resources>
<ResourceDictionary>
<local:EmptyCollectionToBoolConverter x:Key="EmptyCollectionToBoolConverter"/>
<local:Not_EmptyCollectionToBoolConverter x:Key="Not_EmptyCollectionToBoolConverter"/>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.ToolbarItems>
<ToolbarItem Text="Add Item"
Clicked="AddClicked"/>
<ToolbarItem Text="Remove Item"
Clicked="RemoveClicked"/>
</ContentPage.ToolbarItems>
<ContentPage.Content>
<StackLayout>
<!--No data found is bound to Count property of BindingContext (products).
when products change, Count changes and IsVisible is updated.-->
<Label x:Name="noDataLabel"
Text="No data found"
IsVisible="false"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<Label Text="{Binding Path=Count, StringFormat='{0} items'}"
IsVisible="{Binding Path=Count, Converter={StaticResource Not_EmptyCollectionToBoolConverter}}"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage.Content>
</ContentPage>