繁体   English   中英

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

[英]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.

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