Xamarin 不在同一页面中显示来自第二个 CollectionView 的内容

Posted

技术标签:

【中文标题】Xamarin 不在同一页面中显示来自第二个 CollectionView 的内容【英文标题】:Xamarin does not display content from the second CollectionView in the same page 【发布时间】:2021-03-30 11:31:06 【问题描述】:

我的想法是:两个 CollectionView 的一页,其中一个不显示内容。 主 CollectionView 是垂直的。第二个是水平的,是第一个的一部分。

我的步骤: API 响应工作正常。我正确接收到 JSON 格式的数据。

[

    "userName": "User1",
    "imageUrl": "database//icon-library.com/images/default-profile-icon/default-profile-icon-24.jpg",
    "age": 33,
    "atractive": 0,
    "partyMood": 0,
    "fame": 0,
    "friendly": 0,
    "drinkMood": 0,
    "party_Id": 1,
    "description": "Party 1",
    "memberNumber": 10,
    "member": [
        
            "id": 1,
            "fK_Party_Id": 1,
            "partys": null,
            "user_id": 3,
            "member_Gender": "male",
            "member_Age": 33,
            "member_UserName": "User3",
            "member_FirstName": "Vorname",
            "member_LastName": "Nachname",
            "member_ImageUrl": "https://icon-library.com/images/default-profile-icon/default-profile-icon-24.jpg",
            "member_ImageFrame": null,
            "member_Attractive": 0,
            "member_PartyMood": 0,
            "member_Fame": 0,
            "member_Friendly": 0,
            "member_DrinkMood": 0
        
    ],
    "item_Bottle": 0,
    "item_Table": 0,
    "item_GuestList": 0,
    "partyImageUrl": "https://joinapiazure.azurewebsites.net/\\fdc1d73c-fd20-441b-849c-b88164fc485a.jpg",
    "location_Party": null,
    "start_Party": "2020-12-20T04:00:00",
    "end_Party": "2020-12-20T05:00:00"
,

    "userName": "User2",
    "imageUrl": "database/icon-library.com/images/default-profile-icon/default-profile-icon-24.jpg",
    "age": 33,
    "atractive": 0,
    "partyMood": 0,
    "fame": 0,
    "friendly": 0,
    "drinkMood": 0,
    "party_Id": 2,
    "description": "Party 2",
    "memberNumber": 10,
    "member": [
        
            "id": 2,
            "fK_Party_Id": 2,
            "partys": null,
            "user_id": 4,
            "member_Gender": "male",
            "member_Age": 33,
            "member_UserName": "User4",
            "member_FirstName": "Vorname",
            "member_LastName": "Nachname",
            "member_ImageUrl": "https://icon-library.com/images/default-profile-icon/default-profile-icon-24.jpg",
            "member_ImageFrame": null,
            "member_Attractive": 0,
            "member_PartyMood": 0,
            "member_Fame": 0,
            "member_Friendly": 0,
            "member_DrinkMood": 0
        
    ],
    "item_Bottle": 0,
    "item_Table": 0,
    "item_GuestList": 0,
    "partyImageUrl": "database\\f1d1fe71-99ed-49dc-a0f2-1a388cdb6099.jpg",
    "location_Party": null,
    "start_Party": "2020-12-20T04:00:00",
    "end_Party": "2020-12-20T05:00:00"

]

    在第一个 CollectionView 中显示派对(垂直)(工作正常) ItemSource=Binding AllParty 3 在第二个CollectionView中显示党员(水平)(不起作用) ItemSource=绑定成员 如果我给第二个 collectionView 一个独立的来源,它工作正常

它只是不显示成员子列表。当我在调试模式下启动整个过程时,我注意到该值没有传递给私有属性。

我的 Xamal:

<CollectionView Grid.Row="0"
                        ItemsSource="Binding AllParty"
                        SelectionMode="Single"
                        SelectionChangedCommand="Binding Placeholder, Mode=TwoWay"
                        SelectedItem="Binding SelectItem"
                        >
            
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,10,0,0"
                          RowSpacing="0"
                          ColumnSpacing="0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="100" />
                            <RowDefinition Height="25" />
                            <RowDefinition Height="150" />
                            <RowDefinition Height="320" />
                        </Grid.RowDefinitions>
                     

                        <Frame BackgroundColor="LightGray"
                               BorderColor="LightGray"
                               CornerRadius="10"
                               HasShadow="True"
                               Grid.Row="1"
                               Grid.RowSpan="3">
                        </Frame>

                        <Image Source="Binding PartyImageUrl"

                               Grid.Row="0"
                               Aspect="AspectFill" />

                        <StackLayout Margin="0,5,0,0"
                                     Grid.Row="1">
                            <Label FontAttributes="Bold"
                                   FontSize="18"
                                   HorizontalOptions="Center"
                                   Text="Binding UserName" />
                        </StackLayout>
                        <StackLayout Margin="5,5,0,0"
                                     Orientation="Horizontal"
                                     Grid.Row="2">

                            <Image Source="Binding ImageUrl"
                                   Aspect="AspectFill"
                                   Background="black"
                                   HeightRequest="150"
                                   WidthRequest="150" />

                       

                            <StackLayout Orientation="Vertical">
                                <Label Text="Binding Age, StringFormat='Alter: 0'" />
                                <Label Text="Binding Attractive, StringFormat='Attraktivität: 0'" />
                                <Label Text="Binding PartyMood, StringFormat='Stimmungsanreger: 0'" />
                                <Label Text="Binding Fame, StringFormat='Bekanntheit: 0'" />
                                <Label Text="Binding Friendly, StringFormat='Freundlich: 0'" />
                                <Label Text="Binding DrinkMood, StringFormat='Trinklust: 0'" />
                            </StackLayout>

                        </StackLayout>

                        

                        <StackLayout Spacing="10"
                                     Margin="10,0,0,0"
                                     Grid.Row="3"
                                     Orientation="Vertical">

                            <Label Margin="0,10,0,0" Text="Binding Description, StringFormat='Beschreibung: 0'" />

                            <StackLayout Orientation="Vertical">

                                <CollectionView ItemsSource="Binding Member"
                                                ItemsLayout="HorizontalList"
                                                xmlns:model="clr-namespace:JoinAPP.VievModel.Party"
                                                SelectionMode="Single"
                                                SelectionChangedCommand="Binding Placeholder, Mode=TwoWay">
                                    <CollectionView.BindingContext>
                                        <model:PartyModelViewModel/>
                                    </CollectionView.BindingContext>

                                    <CollectionView.ItemTemplate>

                                        <DataTemplate>

                                            <StackLayout Orientation="Vertical"
                                                         Padding="5">

                                                <Image Source="Binding Member_ImageUrl"
                                                       
                                                        
                                                       Aspect="AspectFill"
                                                       Background="black"
                                                       HeightRequest="75"
                                                       WidthRequest="75" />

                                                <Label FontAttributes="Bold"
                                                       FontSize="18"
                                                       HorizontalOptions="Center"
                                                       Text="Binding Member_UserName" />

                                            </StackLayout>

                                        </DataTemplate>
                                    </CollectionView.ItemTemplate>
                                </CollectionView>

                            </StackLayout> 

                      
                           
                            <Label Text="Binding Item_Bootle, StringFormat='Verfügbare Flaschen: 0'" />

                            <Label Text="Binding Item_Table, StringFormat='Verfügbare Tische: 0'" />

                            <Label Text="Binding Item_GuestList, StringFormat='Verfügbare Gästelisteplätze: 0'" />

                            <Label Text="Binding Location_Party, StringFormat='Location: 0'" />

                            <Label Text="Binding Start_Party, StringFormat='Start: 0: dd.MM.yy hh:mm tt'" />

                            <Label Text="Binding End_Party, StringFormat='End: 0: dd.MM.yy hh:mm tt '" />
                        </StackLayout>




                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>

        </CollectionView>

我的模型视图

public class PartyModelViewModel : MemberModel

    public PartyModelViewModel()
    

        RefreshCommand = new Command(GetParty);
        //// selectUser = new Command(async () =>
        // 
        //     var Id = SelectItem.Id;
        //     Preferences.Set("CV_PartyId", Id);

        //     await Application.Current.MainPage.Navigation.PushAsync(new ProfilePage());

        // );

        GetParty();
        //GetAllMember();
        PartyCollection = new ObservableCollection<PartyModel>();
        //MemberCollection = new ObservableCollection<MemberModel>();

    

    public ObservableCollection<PartyModel> PartyCollection;
    //public ObservableCollection<MemberModel> MemberCollection;


    public ICommand RefreshCommand  get; 
    public ICommand SelectUser  get; set; 

    private async void GetParty()
    
        if (AllParty == null)
        
            var allParty = await PartyService.GetAllParty();
          

            foreach (var party in allParty)
            
                
                PartyCollection.Add(party);

            

            AllParty = PartyCollection;

        
        else
        
            
            PartyCollection.Clear();
            var allParty = await PartyService.GetAllParty();
            foreach (var party in allParty)
            
               
                PartyCollection.Add(party);
            
         

            AllParty = PartyCollection;


        


        IsRefreshing = false;

    
    //private async void GetAllMember()
    //
    //    if (AllMember == null)
    //    
    //        var allMember = await PartyService.GetAllMember();


    //        foreach (var member in allMember)
    //        

    //            MemberCollection.Add(member);

    //        

    //        AllMember = MemberCollection;

    //    
    //    else
    //    

    //        MemberCollection.Clear();
    //        if (AllMember == null)
    //        
    //            var allMember = await PartyService.GetAllMember();


    //            foreach (var member in allMember)
    //            

    //                MemberCollection.Add(member);

    //            


    //            AllMember = MemberCollection;


    //        


    //        IsRefreshing = false;
    //    
    //


    private bool _isRefreshing;
    public bool IsRefreshing
    
        get => _isRefreshing;
        set => SetPorperty(ref _isRefreshing, value);
    

    private UserModel _userSelectItem;
    public UserModel UserSelectItem
    
        get => _userSelectItem;
        set => SetPorperty(ref _userSelectItem, value);
    

    private PartyModel _selectItem;
    public PartyModel SelectItem
    
        get => _selectItem;
        set => SetPorperty(ref _selectItem, value);
    


    private ObservableCollection<PartyModel> _allParty;
    public ObservableCollection<PartyModel> AllParty

    
        get => _allParty;
        set => SetPorperty(ref _allParty, value);
    

    //private ObservableCollection<MemberModel> _allMember;
    //public ObservableCollection<MemberModel> AllMember

    //
    //    get => _allMember;
    //    set => SetPorperty(ref _allMember, value);
    //


我的模型

public class PartyModel : UserModel


    private ImageSource _partyProfileImage;
    public ImageSource PartyProfileImage
    
        get => _partyProfileImage;
        set => SetPorperty(ref _partyProfileImage, value);
    

    private int _party_Id;
    public int Party_Id
    
        get => _party_Id;
        set => SetPorperty(ref _party_Id, value);
    

    //Party Bereich
    private  double _fK_User_Id; 
    public double FK_User_Id
    
        get => _fK_User_Id;
        set => SetPorperty(ref _fK_User_Id, value);
    

    private string _description;
    public string Description
    
        get => _description;
        set => SetPorperty(ref _description, value);
    

    private int _memberNumber;
    public int MemberNumber
    
        get => _memberNumber;
        set => SetPorperty(ref _memberNumber, value);
    

    private List<MemberModel> _member;
    public List<MemberModel> Member
    
        get => _member;
        set => SetPorperty(ref _member , value);
    


    private  int _item_Bottle;
    public int Item_Bootle
    
        get => _item_Bottle;
        set => SetPorperty(ref _item_Bottle, value);
    

    private  int _item_Table;
    public int Item_Table
    
        get => _item_Table;
        set => SetPorperty(ref _item_Table, value);
    

    private  int _item_GuestList;
    public int Item_GuestList
    
        get => _item_GuestList;
        set => SetPorperty(ref _item_GuestList, value);
    

    //private  byte[] _imageArray;
    //public byte[] ImageArray
    //
    //    get => _imageArray;
    //    set => SetPorperty(ref _imageArray, value);
    //

    private string _partyImageUrl;
    public string PartyImageUrl
    
        get => _partyImageUrl;
        set => SetPorperty(ref _partyImageUrl, value);
    

    private string _location_Party;
    public string Location_Party
    
        get => _location_Party;
        set => SetPorperty(ref _location_Party, value);
    

    private DateTime _start_Party;
    public DateTime Start_Party
    
        get => _start_Party;
        set => SetPorperty(ref _start_Party, value);
    

    private DateTime _end_Party;
    public DateTime End_Party
    
        get => _end_Party;
        set => SetPorperty(ref _end_Party, value);
    

    private TimeSpan _timespan_Party;
    public TimeSpan Timespan_Party
    
        get => _timespan_Party;
        set => SetPorperty(ref _timespan_Party, value);
    



 public class MemberModel : PartyModel

    //private int _Id;
    //public int Id
    //
    //    get => _Id;
    //    set => SetPorperty(ref _Id, value);
    //

    private int _fK_Party_Id;
    public int FK_Party_Id
    
        get => _fK_Party_Id;
        set => SetPorperty(ref _fK_Party_Id, value);
    

    private int _user_id;
    public int User_id
    
        get => _user_id;
        set => SetPorperty(ref _user_id, value);
    

    private string _memberGender;
    public string Member_Gender
    
        get => _memberGender;
        set => SetPorperty(ref _memberGender, value);
    

    private int _member_Age;
    public int Member_Age
    
        get => _member_Age;
        set => SetPorperty(ref _member_Age, value);
    
   

    private string _member_UserName;
    public string Member_UserName
    
        get => _member_UserName;
        set => SetPorperty(ref _member_UserName, value);
    

    private string _member_FirstName;
    public string Member_FirstName
    
        get => _member_FirstName;
        set => SetPorperty(ref _member_FirstName, value);
    

    private string _member_LastName;
    public string Member_LastName
    
        get => _member_LastName;
        set => SetPorperty(ref _member_LastName, value);
    

    private string _member_ImageUrl;
    public string Member_ImageUrl
    
        get => _member_ImageUrl;
        set => SetPorperty(ref _member_ImageUrl, value);
    

    // Ranking

    private string _member_ImageFrame;
    public string Member_ImageFrame
    
        get => _member_ImageFrame;
        set => SetPorperty(ref _member_ImageFrame, value);
    

    // Rating

    private double _member_Attractive;
    public double Member_Attractive
    
        get => _member_Attractive;
        set => SetPorperty(ref _member_Attractive, value);
    

    private double _member_PartyMood;
    public double Member_PartyMood
    
        get => _member_PartyMood;
        set => SetPorperty(ref _member_PartyMood, value);
    

    private double _member_Fame;
    public double Member_Fame
    
        get => _member_Fame;
        set => SetPorperty(ref _member_Fame, value);
    

    private double _member_Friendly;
    public double Member_Friendly
    
        get => _member_Friendly;
        set => SetPorperty(ref _member_Friendly, value);
    

    private double _member_DrinkMood;
    public double Member_DrinkMood
    
        get => _member_DrinkMood;
        set => SetPorperty(ref _member_DrinkMood, value);
    

    //protected bool SetPorperty<T>(ref T storge, T value, [CallerMemberName] string propertyName = null)
    //
    //    if (EqualityComparer<T>.Default.Equals(storge, value))
    //    
    //        return false;
    //    

    //    storge = value;
    //    OnPropertyChanged(propertyName);
    //    return true;


    //

 

【问题讨论】:

据我所知,Xamarin.Forms 不支持嵌套的 CollectionViews,我建议你可以使用Collectionview grouping 来做到这一点。 【参考方案1】:

在另一个 CollectionView 中插入一个 CollectionView 不是一个好的设计。在您的情况下,您可以使用 Bindable Layout

在xml中

<CollectionView Grid.Row="0"
                        ItemsSource="Binding AllParty"
                        SelectionMode="Single"
                        SelectionChangedCommand="Binding Placeholder, Mode=TwoWay"
                        SelectedItem="Binding SelectItem"
                        >
            
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,10,0,0"
                          RowSpacing="0"
                          ColumnSpacing="0">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="100" />
                            <RowDefinition Height="25" />
                            <RowDefinition Height="150" />
                            <RowDefinition Height="320" />
                        </Grid.RowDefinitions>
                     

                        <Frame BackgroundColor="LightGray"
                               BorderColor="LightGray"
                               CornerRadius="10"
                               HasShadow="True"
                               Grid.Row="1"
                               Grid.RowSpan="3">
                        </Frame>

                        <Image Source="Binding PartyImageUrl"

                               Grid.Row="0"
                               Aspect="AspectFill" />

                        <StackLayout Margin="0,5,0,0"
                                     Grid.Row="1">
                            <Label FontAttributes="Bold"
                                   FontSize="18"
                                   HorizontalOptions="Center"
                                   Text="Binding UserName" />
                        </StackLayout>
                        <StackLayout Margin="5,5,0,0"
                                     Orientation="Horizontal"
                                     Grid.Row="2">

                            <Image Source="Binding ImageUrl"
                                   Aspect="AspectFill"
                                   Background="black"
                                   HeightRequest="150"
                                   WidthRequest="150" />

                       

                            <StackLayout Orientation="Vertical">
                                <Label Text="Binding Age, StringFormat='Alter: 0'" />
                                <Label Text="Binding Attractive, StringFormat='Attraktivität: 0'" />
                                <Label Text="Binding PartyMood, StringFormat='Stimmungsanreger: 0'" />
                                <Label Text="Binding Fame, StringFormat='Bekanntheit: 0'" />
                                <Label Text="Binding Friendly, StringFormat='Freundlich: 0'" />
                                <Label Text="Binding DrinkMood, StringFormat='Trinklust: 0'" />
                            </StackLayout>

                        </StackLayout>

                        

                        <StackLayout Spacing="10"
                                     Margin="10,0,0,0"
                                     Grid.Row="3"
                                     Orientation="Vertical">

                            <Label Margin="0,10,0,0" Text="Binding Description, StringFormat='Beschreibung: 0'" />

                            <ScrollView Orientation="Vertical" >

        <StackLayout Orientation="Vertical" BindableLayout.ItemsSource="Binding Member">
            <BindableLayout.ItemTemplate>
                <DataTemplate>

                    <StackLayout HeightRequest="100" WidthRequest="100" Orientation="Vertical"  Padding="5">


                        <StackLayout.GestureRecognizers>

                            <TapGestureRecognizer Command="Binding Placeholder, Mode=TwoWay"  />

                        </StackLayout.GestureRecognizers>

                        <Image Source="Binding Member_ImageUrl"
                                                       
                                                        
                                                       Aspect="AspectFill"
                                                       Background="black"
                                                       HeightRequest="75"
                                                       WidthRequest="75" />

                        <Label FontAttributes="Bold"
                                                       FontSize="18"
                                                       HorizontalOptions="Center"
                                                       Text="Binding Member_UserName" />

                    </StackLayout>
                </DataTemplate>
            </BindableLayout.ItemTemplate>
        </StackLayout>

    </ScrollView>

                      
                           
                            <Label Text="Binding Item_Bootle, StringFormat='Verfügbare Flaschen: 0'" />

                            <Label Text="Binding Item_Table, StringFormat='Verfügbare Tische: 0'" />

                            <Label Text="Binding Item_GuestList, StringFormat='Verfügbare Gästelisteplätze: 0'" />

                            <Label Text="Binding Location_Party, StringFormat='Location: 0'" />

                            <Label Text="Binding Start_Party, StringFormat='Start: 0: dd.MM.yy hh:mm tt'" />

                            <Label Text="Binding End_Party, StringFormat='End: 0: dd.MM.yy hh:mm tt '" />
                        </StackLayout>




                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>

        </CollectionView>

这是一个similar issue,您可以参考一下。

【讨论】:

以上是关于Xamarin 不在同一页面中显示来自第二个 CollectionView 的内容的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms:应用程序不在页面上显示元素

Xamarin.Forms - oxyplot 不在 CollectionView 内显示

Xamarin Forms Shell 不在详细信息页面上显示菜单栏

DisplayAlert不在Xamarin上显示仅表示ios

在同一个脚本python中使用来自一个请求的第二个url请求的数据

Cookie 未保存在 Xamarin(Android)的 Web 视图中