Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin ListView分组问题_C#_Listview_Xamarin.forms_Grouping - Fatal编程技术网

C# Xamarin ListView分组问题

C# Xamarin ListView分组问题,c#,listview,xamarin.forms,grouping,C#,Listview,Xamarin.forms,Grouping,我在Xamarin中使用ListView进行分组时遇到问题。我看过的指南多得数不清,但我仍然无法让它正常工作。我可以看到ViewModel属性设置正确,但我得到的只是一个空白屏幕。请不要用另一个指南的链接来回答,因为我可能已经看过了,它没有帮助。我相信我很接近 类域: public class TechInventoryDetail { public int EquipmentInventoryDetailEntityId { get; set; } public int Te

我在Xamarin中使用ListView进行分组时遇到问题。我看过的指南多得数不清,但我仍然无法让它正常工作。我可以看到ViewModel属性设置正确,但我得到的只是一个空白屏幕。请不要用另一个指南的链接来回答,因为我可能已经看过了,它没有帮助。我相信我很接近

类域:

public class TechInventoryDetail
{
    public int EquipmentInventoryDetailEntityId { get; set; }

    public int TechId { get; set; }

    public string CodeDetail { get; set; }

    public string CodeDescription { get; set; }

    public int Need { get; set; }

    public int Have { get; set; }

    public string ServiceCategory { get; set; }
}
查看模型属性:

private ObservableRangeCollection<Models.Grouping<string, TechInventoryDetail>> _techEquipmentOverview = new ObservableRangeCollection<Models.Grouping<string, TechInventoryDetail>>();

public ObservableRangeCollection<Models.Grouping<string, TechInventoryDetail>> TechEquipmentOverview
{
    get => _techEquipmentOverview;
    set { _techEquipmentOverview = value; RaisePropertyChanged(); }
}
private ObserverAgeCollection\u techEquipmentOverview=new ObserverAgeCollection();
公共观察收集技术设备概述
{
get=>\u技术设备概述;
设置{u techEquipmentOverview=value;RaisePropertyChanged();}
}
使用视图模型方法设置:

public async Task GetTechEquipmentOverviewAsync()
{
    var result = await _techService.GetTechEquipmentOverviewAsync(false);

    if (result.Success)
    {
        var equipmentGrouped = result.Data.InventoryDetail.GroupBy(c => c.ServiceCategory, c => c);
        var groups = equipmentGrouped.Select(g => new Models.Grouping<string, TechInventoryDetail>(g.Key, g)).ToList();

        if (groups.Any())
        {
            TechEquipmentOverview = new ObservableRangeCollection<Models.Grouping<string, TechInventoryDetail>>();
            TechEquipmentOverview.AddRange(groups);
        }
    }
}
公共异步任务GetTechEquipmentOverviewAsync() { var result=await\u techService.GetTechEquipmentOverviewAsync(false); 如果(结果、成功) { var equipmentGrouped=result.Data.InventoryDetail.GroupBy(c=>c.ServiceCategory,c=>c); var groups=equipmentGrouped.Select(g=>newmodels.Grouping(g.Key,g)).ToList(); if(groups.Any()) { TechEquipmentOverview=新的ObserverAgeCollection(); TechEquipmentOverview.AddRange(组); } } } Xaml列表视图:

<ListView HasUnevenRows="true" 
              IsGroupingEnabled="true"
              GroupDisplayBinding="{Binding Key}"
              ItemsSource="{Binding TechEquipmentOverview}">
        <ListView.GroupHeaderTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <StackLayout Padding="0,5,0,5" Orientation="Vertical">
                            <Label
                                HorizontalTextAlignment="Center"
                                Style="{StaticResource EquipmentGroupHeader}"
                                Text="{Binding Key}" />
                        </StackLayout>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.GroupHeaderTemplate>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid Padding="5">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <Grid.Children>
                            <Label
                                Grid.Row="0"
                                Grid.ColumnSpan="4"
                                HorizontalTextAlignment="Center"
                                LineBreakMode="TailTruncation"
                                Style="{StaticResource DefaultSectionHeader}"
                                Text="{Binding CodeDetail}" />

                            <Label
                                Grid.Row="1"
                                Grid.Column="0"
                                Grid.ColumnSpan="2"
                                Margin="0,5,5,5"
                                Style="{StaticResource H1}"
                                Text="Need" />
                            <Label
                                Grid.Row="2"
                                Grid.Column="0"
                                Grid.ColumnSpan="2"
                                Margin="0,15,5,5"
                                LineBreakMode="TailTruncation"
                                Style="{StaticResource H2}"
                                Text="{Binding Need}" />

                            <Label
                                Grid.Row="1"
                                Grid.Column="2"
                                Grid.ColumnSpan="2"
                                Margin="0,5,5,5"
                                Style="{StaticResource H1}"
                                Text="Have" />
                            <Label
                                Grid.Row="2"
                                Grid.Column="2"
                                Grid.ColumnSpan="2"
                                Margin="0,15,5,5"
                                LineBreakMode="TailTruncation"
                                Style="{StaticResource H2}"
                                Text="{Binding Have}" />
                        </Grid.Children>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

在您的
GetTechEquipmentOverview Async
方法中,您正在重置
TechEquipmentOverview
可观察集合,而UI不知道新列表


您需要在ViewModel中实现
INotifyPropertyChanged
,并通知用户界面列表引用已更改。另外,请确保您正在使用
设备通知主UI线程上的UI。BeginInvokeMainThread

您的类TechInventoryDetail是否需要实现INotifyPropertyChanged?我已将ViewModel属性更改为您建议的。它似乎可以工作,但我必须刷新页面才能显示任何内容。我肯定这和你的最后一句话有关,但我不确定你的意思。有一个主UI线程,UI元素喜欢在它上面更新<代码>列表视图在更新列表时几乎要求您处于UI线程上
iOS
和Android如果不在主UI线程上更新,有时甚至会出现异常。使用
Device.beginInvokeMainThread
将在主线程上运行一个操作,允许UI正确更新。希望这有助于我猜他只需要在构造函数中实例化
TechEquipmentOverview
列表,并且在调用
GetTechEquipmentOverview Async
just
Clear
it.关于主UI的事情:只需将
AddRange
代码更改为:
Device.BeginInvokeMainThread(()=>TechEquipmentOverview.AddRange(组);