[英]Data not binding in Xamarin forms Listview group
我在 Xamarin 表单中使用列表视图分组,但有些数据没有绑定。 我正在使用 Xamarin Forms 3.1 最新版本。 我的代码是:
<ListView ItemsSource="{Binding FacilityList}"
IsGroupingEnabled="true" HasUnevenRows="True" ItemTapped="OnItemTapped">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" TextColor="Black" FontSize="Medium" />
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
<Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
我的视图模型是
private ObservableCollection<FacilitiesGroup> facilityList;
public ObservableCollection<FacilitiesGroup> FacilityList
{
get => facilityList;
set => SetProperty(ref facilityList, value);
}
private Facility selectedItem;
public Facility SelectedItem
{
get => selectedItem;
set
{
SetProperty(ref selectedItem, value);
}
}
public ICommand ItemTappedCommand { get; set; }
public FacilityViewModel()
{
FacilityDataStore facilityDataStore = new FacilityDataStore();
var items = facilityDataStore.GetList();
var groupList = new List<FacilitiesGroup>();
var group = new FacilitiesGroup()
{
Facilities = items.Where(x => x.IsSubscribed == true).ToList(),
Heading = "Subscribed"
};
var group2 = new FacilitiesGroup()
{
Facilities = items.Where(x => x.IsSubscribed == false).ToList(),
Heading = "Unsubscribed"
};
groupList.Add(group);
groupList.Add(group2);
FacilityList = new ObservableCollection<FacilitiesGroup>(groupList);
}
FacilityGroup 类代码是:
public class FacilitiesGroup
{
public List<Facility> Facilities { get; set; }
public string Heading { get; set; }
}
设施类是:
public class Facility
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string Name { get; set; }
public bool IsSubscribed { get; set; }
public string ImageName { get; set; }
}
我正在绑定数据,如:
public MainPage()
{
InitializeComponent();
BindingContext = new FacilityViewModel();
}
我不明白我的代码有什么问题。 任何帮助将不胜感激。 谢谢。
回复较晚,抱歉。 我找到了这个示例,它可能会有所帮助
免责声明:我没有很好地观察 ViewModel/Model 边界。 我只是想弄清楚什么不起作用。 您需要根据您的要求和设计文档更新 ViewModels/Models。
我不认为组标题是您要查找的内容。 这里是Xamarin 文档的链接,它讨论页眉/页脚并有一个图像
让我们从列表视图 1 开始。 删除 GroupHeaderTemplate 并将 GroupDisplayBinding 属性添加到列表视图。
<ListView ItemsSource="{Binding FacilityList}"
IsGroupingEnabled="true"
HasUnevenRows="True"
GroupDisplayBinding="{Binding Heading}" <---------
ItemTapped="OnItemTapped">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
<Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
进行更改后,如果您运行该应用程序。 您应该在列表中看到两个项目。 订阅/取消订阅。 进步!
接下来,我们需要更改 FacilitiesGroup 模型。 我们需要扩展 ObservableCollection。
public class FacilitiesGroup : ObservableCollection<Facility>
{
public string Heading { get; set; }
}
接下来,我们需要对 FacilityViewModel 进行更改
public FacilityViewModel()
{
FacilityDataStore facilityDataStore = new FacilityDataStore();
var items = facilityDataStore.GetList();
var groupList = new List<FacilitiesGroup>();
var group = new FacilitiesGroup()
{
Heading = "Subscribed"
};
foreach( Facility facility in items.Where(x => x.IsSubscribed == true ) )
{
group.Add(facility);
}
var group2 = new FacilitiesGroup()
{
Heading = "Unsubscribed"
};
foreach( Facility facility in items.Where(x => x.IsSubscribed == false ) )
{
group2.Add(facility);
}
groupList.Add(group);
groupList.Add(group2);
FacilityList = new ObservableCollection<FacilitiesGroup>(groupList);
}
希望有帮助! 祝你好运。
首先,您没有提到哪些特定数据没有绑定。 无论如何,请确保您绑定的列表不应该为空或为空。 试试下面的代码。
<ListView x:Name="FacilityListview"
IsGroupingEnabled="true" HasUnevenRows="True" ItemTapped="OnItemTapped">
<ListView.GroupHeaderTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Heading}" TextColor="Black" FontSize="Medium" />
</ViewCell>
</DataTemplate>
</ListView.GroupHeaderTemplate>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Image Source="{Binding ImageName}" HeightRequest="50" WidthRequest="50"/>
<Label Text="{Binding Name}" TextColor="Black" FontSize="Medium"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
现在将 FacilityList 分配为控制器中下方的 itemsSource。
FacilityListview.ItemsSource = FacilityList;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.