在嵌套StackLayout中使用Maui XAML数据绑定InvHeader/InvItems,其中InvHeader.CustId = InvItem.CustId?

kr98yfug  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(142)

我试图在毛伊岛创建一个主/详细信息页面。就像一个发票项目的发票,这个页面必须显示服务器'发票'每个与自己的发票项目。
假设我们有一个发票列表,每个发票在SQL Server中都有两个相关的表(Header和items)。
我将这些表中的每一个放入一个类数组中--一个数组用于发票标题,一个数组用于发票项。
我需要显示所有发票的滚动列表。因此,页面将显示发票标题#1和与invId相关的项目,
然后显示发票题头#2 -以及与该发票关联的发票项。
发票项目必须是特定于所显示的发票-目前我在这方面失败得很严重?
它..几乎..工作,因为我可以在每个InvHeader下的嵌套网格中显示所有InvItems,但我不能限制它们仅显示InvHeader.CustId = InvItem. CustId的InvItems。
如果我能将参数发送到InvItemsForCustIdConverter,那么我就完成了。
它只需要嵌套InvItemsStackLayout的StackLayout的InvHeader.CustId。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Name="parentView"
             xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:converters="clr-namespace:MauiClient"
             x:Class="MauiClient.Invoice"
             Title="Invoice">
    <ContentPage.Resources>
        <ResourceDictionary>
            <converters:InvItemsForCustIdConverter x:Key="InvItemsForCustIdConverter" />
        </ResourceDictionary>
    </ContentPage.Resources>

    <ScrollView>
        <StackLayout>
            <!-- Header section -->
            <Label Text="Hospitals" FontSize="Title" />
            <CollectionView ItemsSource="{Binding invHeaders}" BackgroundColor="Blue">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout>
                            <Label Text="{Binding Company}" />
                            <Label Text="{Binding Addr1}" />
                            <Label Text="{Binding Phone}" />
                            <Label Text="{Binding CustId}" BackgroundColor="Red"  TextColor="White" />
                            <!-- Invoice items section -->
                            <Label Text="Tech Times" FontSize="Title" BackgroundColor="Yellow" TextColor="Black"/>
                            <StackLayout BindingContext="{Binding BindingContext, Source={x:Reference parentView}}" BackgroundColor="Green">
                                <StackLayout BindableLayout.ItemsSource="{Binding InvItems, Converter={StaticResource InvItemsForCustIdConverter}, ConverterParameter={Binding CustId}}">
                                    <BindableLayout.ItemTemplate>
                                        <DataTemplate>
                                            <StackLayout Orientation="Horizontal" Spacing="20">
                                                <Label Text="{Binding ItemId}" />
                                                <Label Text="{Binding CustId}" BackgroundColor="Red"  TextColor="White" />
                                            </StackLayout>
                                        </DataTemplate>
                                    </BindableLayout.ItemTemplate>
                                </StackLayout>
                            </StackLayout>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </StackLayout>
    </ScrollView>
</ContentPage>
public class InvoiceViewModel  {
        public List<InvHeader> InvHeaders { get; set; }
        public List<InvItem> InvItems { get; set; }
}
// changing ConverterParameter={Binding CustId}}">  to ConverterParameter={Binding InvHeader.CustId}}">
// just changes the PATH in parameter to PATH InvHeader.CustId
// we are always passing null??
// value shows as 39 InvItems
// trying a few variations, all of them return null in parameter
// <StackLayout BindableLayout.ItemsSource="{Binding InvItems, Converter={StaticResource InvItemsForCustIdConverter}, ConverterParameter={Binding InvHeader.CustId}}">
// <StackLayout BindableLayout.ItemsSource="{Binding InvItems, Converter={StaticResource InvItemsForCustIdConverter}, ConverterParameter={Binding CustId}}">
// <StackLayout BindableLayout.ItemsSource="{Binding InvItems, Converter={StaticResource InvItemsForCustIdConverter}, ConverterParameter={Binding CustId, Source={x:Reference parentView}, Path=InvHeader}}">

public class InvItemsForCustIdConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
      return value; // If I return the invItems then the display works, but does not Limit the InvItems to those matching the InvHeader StackLayout

      if (value is List<InvItem> invItems && parameter is string custId)
      {
          return invItems.Where(x => x.CustId == custId).ToList();
      }
      return null;
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
      throw new NotImplementedException();
  }
}
nom7f22z

nom7f22z1#

我需要显示所有发票的滚动列表,因此页面将显示发票头#1和与该invId关联的项目。
我建议您可以使用SQL从两个表中查询所需的数据,而不是使用ConverterParameter在代码隐藏中编写逻辑代码。
如果你想在代码隐藏中处理数据,你可以把两个表的数据放到两个列表中,每个列表都有自己的实体,这样你就可以更方便地处理数据。

相关问题