C# Xamarin表单列表视图分组绑定问题

C# Xamarin表单列表视图分组绑定问题,c#,listview,xamarin.forms,grouping,C#,Listview,Xamarin.forms,Grouping,我尝试使用Xamarin表单已有一段时间了,然后遇到了Listview分组。我没有完成显示空白列表。请帮我找出哪里出了问题?提前谢谢 但是,我的类域看起来像: public class LineItemTaxDto { public int InvoiceLineItemId { get; set; } public int InvoiceId { get; set; } public int TaxId { get; set; }

我尝试使用Xamarin表单已有一段时间了,然后遇到了Listview分组。我没有完成显示空白列表。请帮我找出哪里出了问题?提前谢谢

但是,我的类域看起来像:

public class LineItemTaxDto 
    {
        public int InvoiceLineItemId { get; set; }
        public int InvoiceId { get; set; }
        public int TaxId { get; set; }
        public decimal TaxRate { get; set; }
        public decimal TaxAmount { get; set; }
        public string TaxName { get; set; }    
    }
我的视图模型属性看起来像

 public IEnumerable<KeyValuePair<string, ObservableCollection<LineItemTaxDto>>> ReceiptTaxList { get; set; }
public IEnumerable ReceiptTaxList{get;set;}
我的预期结果如下:

下面是我的xaml代码

          <ListView x:Name="TaxListView"
                Grid.Row="2" 
                Grid.Column="0" 
                Grid.ColumnSpan="2"
                ItemsSource="{Binding Invoice.ReceiptTaxList}" 
                IsGroupingEnabled="true">
                <ListView.GroupHeaderTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Label Text="{Binding Key}" />
                        </ViewCell>
                    </DataTemplate>
                </ListView.GroupHeaderTemplate>

                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid RowSpacing="0" ColumnSpacing="0">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="150" />
                                </Grid.ColumnDefinitions>

                                <Label Text="{Binding TaxName}" Grid.Row="0" Grid.Column="0" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" HorizontalTextAlignment="End" Margin="0,5,0,5" />

                                <Label Grid.Row="0" Grid.Column="1" Text="{Binding TaxAmount, Converter={Helpers:CurrencyAmountConverter}}" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" Margin="0,5,0,5" />
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

编辑

我在视图中设置值将出现方法

Invoice.ReceiptTaxList = Invoice.InvoiceLineItems.Select(x => { return new KeyValuePair<string, ObservableCollection<LineItemTaxDto>>(x.TaxName, x.LineItemTaxes); });
Invoice.ReceiptTaxList=Invoice.InvoiceLineItems.Select(x=>{returnnewkeyvaluepair(x.TaxName,x.lineitemtaxs);});
该值设置正确

(很抱歉英语不好)

必须使用列表项列表作为listview上的源,才能使其正常工作。我建议您创建一个具有要在标题处显示的属性的类,如下所示:

public class TaxesObservableCollection<T> : ObservableCollection<T> // Think about to implement INotifyPropertyChanged too, I guess it will be usefull
{
    public TaxesObservableCollection(IEnumerable<T> collection, string taxGroupName) : base(collection)
    {
        TaxGroupName = taxGroupName;
    }

    private bool taxGroupName;
    public bool TaxGroupName
    {
        get { return taxGroupName; }
        set { taxGroupName = value; }
    }
}
公共类taxesAbservableCollection:ObservableCollection//考虑实现INotifyPropertyChanged,我想它会有用的
{
公共TaxesAbservableCollection(IEnumerable collection,字符串taxGroupName):基本(集合)
{
TaxGroupName=TaxGroupName;
}
私有bool-taxGroupName;
公共bool TaxGroupName
{
获取{return taxGroupName;}
设置{taxGroupName=value;}
}
}
在视图模型中:

public IEnumerable<TaxesObservableCollection<LineItemTaxDto>> ReceiptTaxList { get; set; }
public IEnumerable ReceiptTaxList{get;set;}
您的列表视图:

(...) // The rest of it as you did
<ListView.GroupHeaderTemplate>
    <DataTemplate>
        <ViewCell>
            <Label Text="{Binding TaxGroupName}" />
        </ViewCell>
    </DataTemplate>
</ListView.GroupHeaderTemplate>
(...) // The rest of it as you did
(…)//剩下的就跟你做的一样
(…)//剩下的就跟你一样
你可以这样填:

Invoice.ReceiptTaxList = Invoice.InvoiceLineItems.Select(x => { return new TaxesObservableCollection<LineItemTaxDto>(x.LineItemTaxes, x.TaxName); }).ToList();
Invoice.ReceiptTaxList=Invoice.InvoiceLineItems.Select(x=>{return new TaxesObservableCollection(x.lineitemtaxs,x.TaxName);}.ToList();

它应该可以工作,请告诉我这是否是您想要的。

我已经解决了这个棘手的代码,没有使用分组,但现在它的工作与预期一样

我的视图模型代码

var TaxList = Invoice.InvoiceLineItems.Where(x => x.TaxId > 1).GroupBy(y=>y.TaxId > 1).Select(x =>
 {
    return new KeyValuePair<LineItemTaxDto, ObservableCollection<LineItemTaxDto>>(new LineItemTaxDto()
    {
        InvoiceLineItemId = x.First().Id,
        InvoiceId = x.First().InvoiceId,
        TaxId = x.First().TaxId,
        TaxRate = x.First().TaxRate,
        TaxAmount = x.Sum(a=>a.TaxAmount),
        TaxName = taxlabel + " (" + x.First().TaxName + ")"
    }, x.First().LineItemTaxes);
 });

var taxes = new ObservableCollection<LineItemTaxDto>();
foreach (var tax in TaxList.GroupBy(tax => tax.Key.TaxId).Select(grp => grp.First()))
{
    taxes.Add(tax.Key);
    foreach (var subtax in tax.Value.Where(x => x.TaxId > 0))
    {
        taxes.Add(subtax);
    }
}

Invoice.ReceiptTaxList = taxes;
<ListView 
x:Name="TaxListView"
ItemsSource="{Binding Invoice.ReceiptTaxList}" 
Grid.Row="2" 
Grid.Column="0" 
Grid.ColumnSpan="2"
VerticalOptions="FillAndExpand" 
HorizontalOptions="FillAndExpand"
SeparatorVisibility="None"
HasUnevenRows="false"
RowHeight="35"
>
<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <Grid RowSpacing="0" ColumnSpacing="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="150" />
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Text="{Binding TaxName}" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" HorizontalTextAlignment="End" Margin="0,5,0,5" />
                <Label Grid.Row="0" Grid.Column="1" Text="{Binding TaxAmount, Converter={Helpers:CurrencyAmountConverter}}" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" Margin="0,5,0,5" />
            </Grid>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>
var TaxList=Invoice.InvoiceLineItems.Where(x=>x.TaxId>1)。GroupBy(y=>y.TaxId>1)。选择(x=>
{
返回新的KeyValuePair(新的LineItemTaxDto()
{
InvoiceLineItemId=x.First().Id,
InvoiceId=x.First().InvoiceId,
TaxId=x.First().TaxId,
TaxRate=x.First().TaxRate,
TaxAmount=x.Sum(a=>a.TaxAmount),
TaxName=taxlabel+“(“+x.First().TaxName+”)
},x.First().LineItemTaxes);
});
var税=新的可观测集合();
foreach(TaxList.GroupBy(tax=>tax.Key.TaxId)中的var tax)。选择(grp=>grp.First())
{
taxes.Add(tax.Key);
foreach(税收价值中的var子税,其中(x=>x.TaxId>0))
{
税费。加上(子税费);
}
}
Invoice.ReceiptTaxList=税款;
我的Xaml代码

var TaxList = Invoice.InvoiceLineItems.Where(x => x.TaxId > 1).GroupBy(y=>y.TaxId > 1).Select(x =>
 {
    return new KeyValuePair<LineItemTaxDto, ObservableCollection<LineItemTaxDto>>(new LineItemTaxDto()
    {
        InvoiceLineItemId = x.First().Id,
        InvoiceId = x.First().InvoiceId,
        TaxId = x.First().TaxId,
        TaxRate = x.First().TaxRate,
        TaxAmount = x.Sum(a=>a.TaxAmount),
        TaxName = taxlabel + " (" + x.First().TaxName + ")"
    }, x.First().LineItemTaxes);
 });

var taxes = new ObservableCollection<LineItemTaxDto>();
foreach (var tax in TaxList.GroupBy(tax => tax.Key.TaxId).Select(grp => grp.First()))
{
    taxes.Add(tax.Key);
    foreach (var subtax in tax.Value.Where(x => x.TaxId > 0))
    {
        taxes.Add(subtax);
    }
}

Invoice.ReceiptTaxList = taxes;
<ListView 
x:Name="TaxListView"
ItemsSource="{Binding Invoice.ReceiptTaxList}" 
Grid.Row="2" 
Grid.Column="0" 
Grid.ColumnSpan="2"
VerticalOptions="FillAndExpand" 
HorizontalOptions="FillAndExpand"
SeparatorVisibility="None"
HasUnevenRows="false"
RowHeight="35"
>
<ListView.ItemTemplate>
    <DataTemplate>
        <ViewCell>
            <Grid RowSpacing="0" ColumnSpacing="0">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="150" />
                </Grid.ColumnDefinitions>
                <Label Grid.Row="0" Grid.Column="0" Text="{Binding TaxName}" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" HorizontalTextAlignment="End" Margin="0,5,0,5" />
                <Label Grid.Row="0" Grid.Column="1" Text="{Binding TaxAmount, Converter={Helpers:CurrencyAmountConverter}}" FontSize="22" FontFamily="{x:Static resources:Fonts.ArialMTFont}" HorizontalOptions="End" Margin="0,5,0,5" />
            </Grid>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>


什么是“键”属性?你怎么填呢?你能把密码寄出去吗?也许我能帮你再次检查我的问题我编辑了它。