问题描述
我的想法是:两个 CollectionView 中的一页,其中一个不显示内容。 Main 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","party_Id": 2,"description": "Party 2","member": [
{
"id": 2,"fK_Party_Id": 2,"user_id": 4,"member_UserName": "User4","partyImageUrl": "database\\f1d1fe71-99ed-49dc-a0f2-1a388cdb6099.jpg","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"
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"
Grid.Row="1">
<Label FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Center"
Text="{Binding UserName}" />
</StackLayout>
<StackLayout Margin="5,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"
Grid.Row="3"
Orientation="Vertical">
<Label Margin="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;
//}
}
解决方法
在另一个 CollectionView 中插入一个 CollectionView 不是一个好的设计。在您的情况下,您可以使用 Bindable Layout .
在 xaml 中
<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"
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"
Grid.Row="1">
<Label FontAttributes="Bold"
FontSize="18"
HorizontalOptions="Center"
Text="{Binding UserName}" />
</StackLayout>
<StackLayout Margin="5,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"
Grid.Row="3"
Orientation="Vertical">
<Label Margin="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,您可以参考。