Xamarin.Forms 列表视图未在 Android 中更新
Xamarin.Forms listview not updating in Android
在网上搜索每个论坛后,我决定 post 我自己的问题:我的列表视图数据在 IOS 中显示正确,但在 Android 中显示不正确。我绑定到我的视图模型中的 属性 并且看起来正确但我无法弄清楚我缺少什么(我正在尝试获取订单列表来填充我的列表视图)。感谢您的帮助!
另外,我使用的是标签页布局。不确定这是否有所作为。
//View model
public ObservableCollection<GroupedOrderModel> ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set {
listOfOrdersGrouped = value;
NotifyPropertyChanged("listOfOrdersGrouped");
}
}
public class OrderList : List<OrderStatusInfo>
{
public string Heading { get; set; }
public List<OrderStatusInfo> Orders
{
get { return this; }
set { Orders = value; }
}
}
public async Task<bool> BuildListviewData()
{
await Task.Run(()=> {
ObservableCollection<GroupedOrderModel> orderList = new ObservableCollection<GroupedOrderModel>();
if (GlobalInfo.GlobalOrderList != null && GlobalInfo.GlobalOrderList.Count > 0)
{
List<string> Headers = GlobalInfo.GlobalOrderList.Select(x => x.Status).Distinct().OrderBy(x => x).ToList();
foreach (var item in Headers)
{
var oGroup = new GroupedOrderModel
{
Heading = item
};
var oList = GlobalInfo.GlobalOrderList.Where(x => x.Status == item).ToList();
foreach (var o in oList)
oGroup.Add(o);
orderList.Add(oGroup);
}
ListOfOrdersGrouped = orderList;
}
}
}
//Orders.cs page
protected async override void OnAppearing()
{
await ovm.BuildListviewData();
BindingContext = ovm;
base.OnAppearing();
}
//The XAML
<ListView x:Name="ListViewOrdersList" HasUnevenRows="True" ItemsSource="{Binding ListOfOrdersGrouped}" IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" Margin="10"/>
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10">
<Label Text="{Binding OrderNo}" FontSize="20" HorizontalOptions="Start"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
将您的 ItemSsource 属性 更改为
private listOfOrdersGrouped;
public ObservableCollection ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set {
listOfOrdersGrouped = value;
NotifyPropertyChanged("ListOfOrdersGrouped");
}
}
INotifyPropertyChanged 应该是:
NotifyPropertyChanged("ListOfOrdersGrouped");
以便名称与您在 XAML 中绑定的 属性 的名称相匹配。
致所有遇到同样问题的人:
问题最终成为我的视图模型是特定于页面的问题(例如 OrdersViewModel.cs 用于我的 Orders.xaml.cs 页面)。在我为我的 App.xaml.cs 页面创建一个 AppViewModel.cs 并将我的 OrdersViewModel 属性转储到名为 OrdersViewModel 的新 class 下后,由于项目运行 App.xaml 和 App.xaml.cs 启动页面,然后再执行任何其他操作。这就是绑定在 IOS 而不是 Android 中起作用的原因。 Android 试图在绑定完成实例化之前处理每个选项卡式页面的所有代码(因此,没有显示数据!)。
不过,我确实稍微调整了我的代码。以下是更改:
namespace MyApp.ViewModels
{
public class AppViewModel
{
public OrdersViewModel Ovm { get; set; }
}
public class OrdersViewModel : INotifyPropertyChanged
{
public ObservableCollection<GroupedOrderModel> ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set
{
listOfOrdersGrouped = value;
NotifyPropertyChanged("ListOfOrdersGrouped");
}
}
public async Task<bool> BuildListviewData()
{
//Same code here as mentioned above
}
}
//Deleted OrderList class mentioned above
public class GroupedOrderModel : ObservableCollection<OrderStatusInfo>
{
public string Heading { get; set; }
}
}
//Xaml
<ListView x:Name="ListViewOrdersList" HasUnevenRows="True" ItemsSource="{Binding Ovm.ListOfOrdersGrouped}" IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" Margin="10"/>
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10">
<Label Text="{Binding OrderNo}" FontSize="20" HorizontalOptions="Start"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
编码愉快!
在网上搜索每个论坛后,我决定 post 我自己的问题:我的列表视图数据在 IOS 中显示正确,但在 Android 中显示不正确。我绑定到我的视图模型中的 属性 并且看起来正确但我无法弄清楚我缺少什么(我正在尝试获取订单列表来填充我的列表视图)。感谢您的帮助!
另外,我使用的是标签页布局。不确定这是否有所作为。
//View model
public ObservableCollection<GroupedOrderModel> ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set {
listOfOrdersGrouped = value;
NotifyPropertyChanged("listOfOrdersGrouped");
}
}
public class OrderList : List<OrderStatusInfo>
{
public string Heading { get; set; }
public List<OrderStatusInfo> Orders
{
get { return this; }
set { Orders = value; }
}
}
public async Task<bool> BuildListviewData()
{
await Task.Run(()=> {
ObservableCollection<GroupedOrderModel> orderList = new ObservableCollection<GroupedOrderModel>();
if (GlobalInfo.GlobalOrderList != null && GlobalInfo.GlobalOrderList.Count > 0)
{
List<string> Headers = GlobalInfo.GlobalOrderList.Select(x => x.Status).Distinct().OrderBy(x => x).ToList();
foreach (var item in Headers)
{
var oGroup = new GroupedOrderModel
{
Heading = item
};
var oList = GlobalInfo.GlobalOrderList.Where(x => x.Status == item).ToList();
foreach (var o in oList)
oGroup.Add(o);
orderList.Add(oGroup);
}
ListOfOrdersGrouped = orderList;
}
}
}
//Orders.cs page
protected async override void OnAppearing()
{
await ovm.BuildListviewData();
BindingContext = ovm;
base.OnAppearing();
}
//The XAML
<ListView x:Name="ListViewOrdersList" HasUnevenRows="True" ItemsSource="{Binding ListOfOrdersGrouped}" IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" Margin="10"/>
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10">
<Label Text="{Binding OrderNo}" FontSize="20" HorizontalOptions="Start"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
将您的 ItemSsource 属性 更改为
private listOfOrdersGrouped;
public ObservableCollection ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set {
listOfOrdersGrouped = value;
NotifyPropertyChanged("ListOfOrdersGrouped");
}
}
INotifyPropertyChanged 应该是:
NotifyPropertyChanged("ListOfOrdersGrouped");
以便名称与您在 XAML 中绑定的 属性 的名称相匹配。
致所有遇到同样问题的人:
问题最终成为我的视图模型是特定于页面的问题(例如 OrdersViewModel.cs 用于我的 Orders.xaml.cs 页面)。在我为我的 App.xaml.cs 页面创建一个 AppViewModel.cs 并将我的 OrdersViewModel 属性转储到名为 OrdersViewModel 的新 class 下后,由于项目运行 App.xaml 和 App.xaml.cs 启动页面,然后再执行任何其他操作。这就是绑定在 IOS 而不是 Android 中起作用的原因。 Android 试图在绑定完成实例化之前处理每个选项卡式页面的所有代码(因此,没有显示数据!)。
不过,我确实稍微调整了我的代码。以下是更改:
namespace MyApp.ViewModels
{
public class AppViewModel
{
public OrdersViewModel Ovm { get; set; }
}
public class OrdersViewModel : INotifyPropertyChanged
{
public ObservableCollection<GroupedOrderModel> ListOfOrdersGrouped
{
get { return listOfOrdersGrouped; }
set
{
listOfOrdersGrouped = value;
NotifyPropertyChanged("ListOfOrdersGrouped");
}
}
public async Task<bool> BuildListviewData()
{
//Same code here as mentioned above
}
}
//Deleted OrderList class mentioned above
public class GroupedOrderModel : ObservableCollection<OrderStatusInfo>
{
public string Heading { get; set; }
}
}
//Xaml
<ListView x:Name="ListViewOrdersList" HasUnevenRows="True" ItemsSource="{Binding Ovm.ListOfOrdersGrouped}" IsGroupingEnabled="True">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" Margin="10"/>
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10">
<Label Text="{Binding OrderNo}" FontSize="20" HorizontalOptions="Start"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
编码愉快!