CollectionView 项目未出现在发布模式下

Ali*_*isa 6 .net release image collectionview maui

z在 .net Maui 应用程序中,我遇到以下问题:我的集合视图在调试模式下工作正常,但在发布模式下,集合视图仅显示一个白色矩形,而不是图像和两个标签。onClick 函数工作正常:\n这是 xaml:

\n
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"\n             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"\n             xmlns:vm="clr-namespace:VegaMaui"\n             xmlns:model="clr-namespace:VegaMaui.Model"\n             x:Class="VegaMaui.MenuDetails"   x:DataType="vm:MenuDetailsViewModel"        \n             Title="\xd4\xb1\xd5\xba\xd6\x80\xd5\xa1\xd5\xb6\xd6\x84\xd5\xb6\xd5\xa5\xd6\x80"\n             BackgroundColor="#f9f9f9">   \n    <CollectionView \n            RemainingItemsThreshold="5"\n            RemainingItemsThresholdReachedCommand="{Binding LoadMoreS}"\n            SelectionMode="Single"\n            SelectionChanged="OnProdSelectionChanged"\n            ItemsSource="{Binding ProdListS}"\n            x:Name="prodcollect">\n        <CollectionView.ItemsLayout>\n            <GridItemsLayout Orientation="Vertical"\n                        Span="2" />\n        </CollectionView.ItemsLayout>       \n        <CollectionView.ItemTemplate>            \n            <DataTemplate x:DataType="model:ProductImg">                    \n                <Grid Margin="5,5,5,5" Padding="1" >\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height="Auto" />\n                        <RowDefinition Height="Auto" />\n                        <RowDefinition Height="Auto" />\n                        <RowDefinition Height="Auto" />\n                    </Grid.RowDefinitions>\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width="*" />                           \n                    </Grid.ColumnDefinitions>\n                    <Image\n                        Grid.Row="0"                           \n                        Grid.Column="0"                         \n                        Source= "{Binding firstPicture}"                        \n                        Aspect="AspectFill"/>                    \n                    <Label Grid.Row="1"\n                        Grid.Column="0"                      \n                        FontAttributes="Bold"\n                        BackgroundColor="White"\n                        LineBreakMode="WordWrap"\n                        Text="{Binding product_Name}"\n                        VerticalOptions="Start" />\n                    <Label Grid.Row="2"\n                        Grid.Column="0"                      \n                        FontAttributes="Bold"\n                        LineBreakMode="WordWrap"\n                        BackgroundColor="White"\n                        Text="{Binding product_DisPrice, StringFormat='{0:F0} \xd5\xa4\xd6\x80.'}"\n                        TextColor ="Red" FontSize="Default"\n                        VerticalOptions="Start" />\n                    <Label Grid.Row="3"\n                        Grid.Column="0"                                   \n                        LineBreakMode="WordWrap"\n                        BackgroundColor="White"\n                        IsVisible="{Binding IsShowMode}"\n                        Text="{Binding product_Price, StringFormat='{0:F0} \xd5\xa4\xd6\x80.'}"\n                        TextColor="#40414a"  FontSize="Default" \n                        TextDecorations="Strikethrough"\n                        VerticalOptions="Start" />\n\n                </Grid>                    \n            </DataTemplate>\n        </CollectionView.ItemTemplate>\n    </CollectionView>   \n</ContentPage>\n
Run Code Online (Sandbox Code Playgroud)\n

这是视图模型:

\n
namespace VegaMaui\n{\n    public  class MenuDetailsViewModel : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n        private int startindex = 1;\n        private int endindex = 10;        \n        private string SubGrInd = "";\n        private readonly VegaApi ApiControl;\n        private void OnPropertyChanged(string propertyName) =>\n            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n        public MenuDetailsViewModel(string SubGroup)\n        {\n            SubGrInd = SubGroup;    \n             ApiControl = new();\n            // Task.Run(() => this.LoadData(SubGroup)).Wait();\n            ProdListS = new ObservableCollection<Model.Product>();\n            new Thread(() =>\n            {\n                LoadDataS();\n            }).Start();\n            \n        }        \n        public async Task LoadDataS()\n        {           \n            var data =  await ApiControl.GetMenuDetAsync(SubGrInd, startindex,endindex);\n            ProdListS = new ObservableCollection<Model.Product>(data);\n            PropertyChanged.Invoke(this,new PropertyChangedEventArgs(nameof(ProdListS)));\n        }\n        public ICommand LoadMoreS => new Command(async () =>\n        {           \n            startindex += 16;\n            endindex += 16;\n                ObservableCollection<Model.Product> data = null;\n                new Thread(() =>\n                {\n                     data=  ApiControl.GetMenuDetAsync(SubGrInd, startindex, endindex).Result;          \n                    foreach (var item in data)\n                    {\n                        ProdListS.Add(item);\n                        PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ProdListS)));\n                    }               \n                }).Start();            \n        });       \n        public ObservableCollection<Model.Product> ProdListS { get; set; } \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    }        \n    public async Task LoadDataS()\n    {           \n        var data =  await ApiControl.GetMenuDetAsync(SubGrInd, startindex,endindex);\n        ProdListS = new ObservableCollection<Model.Product>(data);\n        PropertyChanged.Invoke(this,new PropertyChangedEventArgs(nameof(ProdListS)));\n    }\n    public ICommand LoadMoreS => new Command(async () =>\n    {           \n        startindex += 16;\n        endindex += 16;\n            ObservableCollection<Model.Product> data = null;\n            new Thread(() =>\n            {\n                 data=  ApiControl.GetMenuDetAsync(SubGrInd, startindex, endindex).Result;          \n                foreach (var item in data)\n                {\n                    ProdListS.Add(item);\n                    PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ProdListS)));\n                }               \n            }).Start();            \n    });       \n    public ObservableCollection<Model.Product> ProdListS { get; set; } \n}\n
Run Code Online (Sandbox Code Playgroud)\n

}

\n

公共部分类 MenuDetails : ContentPage\n{\npublic string[] ImgList;

\n
private MenuDetailsViewModel _mdvm;\npublic MenuDetails(string subGID)\n{        \n    BindingContext = _mdvm = new MenuDetailsViewModel(subGID);\n    InitializeComponent();    \n   \n}\nasync void OnProdSelectionChanged(object sender, SelectionChangedEventArgs e)\n{\n    \n    Model.Product prodItem = this.prodcollect.SelectedItem as Model.Product;\n    int id_Param = prodItem.product_Id;\n    VegaApi ApiControl = new();\n    List<Model.ProdParams> ParamList = await ApiControl.GetParamDetAsync(id_Param.ToString());      \n    ProdInformation ProfilePage = new ProdInformation();\n    ProfilePage.Title = this.Title;\n    ProfilePage.BindingContext = prodItem;        \n    VerticalStackLayout PropsStack = ProfilePage.FindByName<VerticalStackLayout>("InfoLayout");\n    //Label NmLabel = ProfilePage.FindByName<Label>("prodname");\n    //NmLabel.Text = prodItem.product_Name;\n    //Label PrLabel = ProfilePage.FindByName<Label>("prodprice");\n    //PrLabel.Text = prodItem\xe2\x80\xa4+ " \xd5\xa4\xd6\x80.";\n   \n    // Adding Images carousel view      \n    string[] picarray = prodItem.product_PicturePath.Split('@');\n        System.Collections.ObjectModel.ObservableCollection<Promo> Data = new System.Collections.ObjectModel.ObservableCollection<Promo>();      \n    Data.Add(new Promo() { ImgSource =prodItem.firstPicture});\n    if (picarray.Count() > 1)\n    {          \n        for (int k = 1; k < picarray.Count(); k++)\n        {\n            if (picarray[k] != null && picarray[k].Length > 3)\n            {\n                Data.Add(new Promo() { ImgSource = "https://vega.am/image/"+ picarray[k] });\n            }\n        }\n    }\n   \n   CarouselView CurCarousel= ProfilePage.FindByName<CarouselView>("pcarousel");\n    CurCarousel.ItemsSource = Data;\n    //  StackLayout slayout = new StackLayout();    \n   \n   \n   // PropsStack.Add(primage);\n    List<int> TitleIds = (from el in ParamList select el.Title_Id).Distinct().ToList();\n    if (TitleIds != null && TitleIds.Count > 0)\n    {\n        for (int j = 0; j<TitleIds.Count; j++)\n        {\n            List<Model.ProdParams> subLst= ParamList.Where(p => p.Title_Id == TitleIds[j]).ToList();\n            if(subLst != null && subLst.Count > 0)\n            {\n                Label ltitle= new Label();\n                ltitle.Text = subLst[0].Title_Name;\n                ltitle.FontSize = 18;\n                ltitle.TextColor = Color.FromRgb(16, 26, 175);\n                ltitle.Padding = new Thickness(3, 5, 3, 5);\n                ltitle.HorizontalOptions = LayoutOptions.Start;\n                PropsStack.Add(ltitle);\n                Grid CurGrid = new Grid\n                {\n                    \n                    ColumnDefinitions =\n                     {\n                        new ColumnDefinition{Width = new GridLength(5, GridUnitType.Star)},\n                        new ColumnDefinition{Width = new GridLength(3, GridUnitType.Star)}\n                     }\n                };                    \n                for (int q=0;q< subLst.Count;q++)\n                {     \n                    CurGrid.AddRowDefinition(new RowDefinition());\n                   \n                    \n                    CurGrid.Add(new Label\n                    {\n                        \n                        Text = subLst[q].Param_Name+" ",\n                        LineBreakMode = LineBreakMode.WordWrap,\n                        MaxLines =2,\n                        HorizontalOptions = LayoutOptions.Start,\n                        VerticalOptions = LayoutOptions.Center\n                    },0,q);\n                    CurGrid.Add(new Label\n                     {\n                        Text = subLst[q].Param_Value,\n                        LineBreakMode = LineBreakMode.WordWrap,\n                        MaxLines = 2,\n                        HorizontalOptions = LayoutOptions.Start,\n                        VerticalOptions = LayoutOptions.Center\n                    },1,q);\n                }\n                PropsStack.Add(CurGrid);\n            }\n        }\n    }        \n    await Navigation.PushAsync(ProfilePage);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

}

\n

H.A*_*.H. 3

我看到绑定的 ItemsSource:

ItemsSource="{Binding ProdListS}"
Run Code Online (Sandbox Code Playgroud)

指定ProductImg型号:

<DataTemplate x:DataType="model:ProductImg">
Run Code Online (Sandbox Code Playgroud)

然而在代码中你有:

public ObservableCollection<Model.Product> ProdListS { get; set; } 
Run Code Online (Sandbox Code Playgroud)

这是你应该努力的。

不匹配模型是完全可以的,甚至不指定模型作为 DataTemplate 的 DataType。只要你调试一下。

在发行版中情况并不相同。

  • 是的,数据类型不匹配是一个问题。但为什么它在调试模式下工作呢?我只是对此感到好奇。 (3认同)
  • 好吧,这真是令人难以置信,让 op 尝试一下。感谢您的分享。 (2认同)