1

I am using List view Grouping in Xamarin forms, but some how data is not binding. I am using Xamarin Forms 3.1 latest version. My code is :

<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>

And my view model is

 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 Class code is :

public class FacilitiesGroup
{
    public List<Facility> Facilities { get; set; }
    public string Heading { get; set; }
}

And Facility class is :

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; }
}

I am binding data like :

public MainPage()
    {
        InitializeComponent();
        BindingContext = new FacilityViewModel();
    }

I don't understand what is wrong with my code. Any help will be appreciated. Thanks.

4

2 回答 2

1

回复较晚,抱歉。我找到了这个样本,它可能会有所帮助

免责声明:我没有很好地观察 ViewModel/Model 边界。我只是想弄清楚什么不起作用。您需要根据您的要求和设计文档更新 ViewModels/Models。

我不认为组标题是你要找的。这是Xamarin 文档的链接,其中讨论页眉/页脚并有图像

让我们从第一个列表视图开始。删除 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>

一旦你做出改变,如果你运行应用程序。您应该在列表中看到两个项目。订阅/取消订阅。进步!

接下来,我们需要更改设施组模型。我们需要扩展 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);
}

希望有帮助!祝你好运。

于 2018-09-19T02:17:55.630 回答
0

首先,您没有提到哪些特定数据未绑定。无论如何,请确保您绑定的列表不应为空或为空。试试下面的代码。

<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;
于 2018-09-17T06:05:46.677 回答