我试图在毛伊岛创建一个主/详细信息页面。就像一个发票项目的发票,这个页面必须显示服务器'发票'每个与自己的发票项目。
假设我们有一个发票列表,每个发票在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();
}
}
1条答案
按热度按时间nom7f22z1#
我需要显示所有发票的滚动列表,因此页面将显示发票头#1和与该invId关联的项目。
我建议您可以使用SQL从两个表中查询所需的数据,而不是使用
ConverterParameter
在代码隐藏中编写逻辑代码。如果你想在代码隐藏中处理数据,你可以把两个表的数据放到两个列表中,每个列表都有自己的实体,这样你就可以更方便地处理数据。