简体   繁体   English

Xamarin 表单列表视图组中未绑定的数据

[英]Data not binding in Xamarin forms Listview group

I am using List view Grouping in Xamarin forms, but some how data is not binding.我在 Xamarin 表单中使用列表视图分组,但有些数据没有绑定。 I am using Xamarin Forms 3.1 latest version.我正在使用 Xamarin Forms 3.1 最新版本。 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 : FacilityGroup 类代码是:

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.谢谢。

Sorry for the delayed response.回复较晚,抱歉。 I found this sample , it might be helpful我找到了这个示例,它可能会有所帮助

Disclaimer : I am not observing ViewModel/Model boundaries very well.免责声明:我没有很好地观察 ViewModel/Model 边界。 I am just trying to figure out what is not working.我只是想弄清楚什么不起作用。 you need to update the ViewModels/Models per your requirements and design documents.您需要根据您的要求和设计文档更新 ViewModels/Models。

I don't think group header is what you are looking for.我不认为组标题是您要查找的内容。 here is a link to the Xamarin documentation where it talks about header/footer and has an image这里是Xamarin 文档的链接,它讨论页眉/页脚并有一个图像

Let's start with the listview 1st.让我们从列表视图 1 开始。 Remove the GroupHeaderTemplate and add GroupDisplayBinding attribute the to the listview.删除 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>

Once you make that change, if you run the app.进行更改后,如果您运行该应用程序。 you should see two items in the list.您应该在列表中看到两个项目。 Subscribed/Unsubscribed.订阅/取消订阅。 Progress!进步!

Next, we need to change FacilitiesGroup Model.接下来,我们需要更改 FacilitiesGroup 模型。 We need to extend ObservableCollection.我们需要扩展 ObservableCollection。

public class FacilitiesGroup : ObservableCollection<Facility>
{
    public string Heading { get; set; }
}

Next, we need to make a change in the FacilityViewModel接下来,我们需要对 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);
}

Hope that helps!希望有帮助! Goodluck.祝你好运。

First, You did not mention which particular data is not binded.首先,您没有提到哪些特定数据没有绑定。 Anyways make sure that the list that you are binding should not be empty or null.无论如何,请确保您绑定的列表不应该为空或为空。 Just try below code.试试下面的代码。

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

Now assign the FacilityList as itemsSource below in the controller.现在将 FacilityList 分配为控制器中下方的 itemsSource。

FacilityListview.ItemsSource = FacilityList;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM