У меня есть класс, который содержит разные характеристики для покемонов
public ObservableCollection<Pokemon> GetMesPokemons()
{
ObservableCollection<Pokemon> lstPokemons =
new ObservableCollection<Pokemon>();
lstPokemons.Add(new Pokemon()
{
NamePokemon = "Raichu",
UrlImage = "https://i0.wp.com/pokemon-suisse.ch/wp-content/uploads/2021/06/img_1517.jpg?resize=1536%2C2048&ssl=1",
Abilities = new List<Ability>()
{
new Ability
{
Name = "Thunderbolt",
NbPower = 120
},
new Ability
{
Name = "Spark Ball GX",
NbPower = 200
}
},
PokemonClass = new PokemonType()
{
NameClass = "Electric",
UrlImage = "https://th.bing.com/th/id/OIP.T-kNLsS_VhinWEuPIfZdHAHaHk?w=159&h=180&c=7&r=0&o=5&pid=1.7"
},
Pv = 210
Я могу получить имя покемона и его изображение и pv, но когда я пытаюсь получить его "Способности", я получаю это сообщение на дисплее: System.Collections.Generic.List'1[MauiApp2.Models.Ability]
Вот как я пытаюсь вернуть его
<CollectionView
x:Name = "PokemonsAbilities"
ItemsSource = "{Binding AbilitiesSource}"
ItemTemplate = "{StaticResource AbilitiesTemplate}">
</CollectionView>
<!--Récupération de l'image d'un pokemonRandom-->
<Image Source = "{Binding SelectedPokemon.UrlImage}" WidthRequest = "150" HeightRequest = "150"/>
<!--Récupération du nom d'un pokemonrandom-->
<Label
Text = "{Binding SelectedPokemon.NamePokemon}"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
<Label
Text = "{Binding SelectedPokemon.Pv}"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
<Label
Text = "{Binding SelectedPokemon.Abilities}"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
Это моя модель покемона
public class Pokemon
{
private string _namePokemon;
public string NamePokemon
{
get { return _namePokemon; }
set { _namePokemon = value; }
}
private string _urlImage;
public string UrlImage
{
get { return _urlImage; }
set { _urlImage = value; }
}
private int _pv;
public int Pv
{
get { return _pv; }
set { _pv = value; }
}
public List<Ability> Abilities { get; set; }
Это моя модель способностей
public class Ability
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _nbPower;
public int NbPower
{
get { return _nbPower; }
set { _nbPower = value; }
}
Мой шаблон
<DataTemplate x:Key = "LstPokemons">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<!--<Button Text = "Profil"></Button>-->
<Image Source = "{Binding UrlImage}" Grid.Column = "2" WidthRequest = "150" HeightRequest = "150"></Image>
<Label Text = "{Binding NamePokemon}" Grid.Column = "0"></Label>
</Grid>
</DataTemplate>
<DataTemplate x:Key = "Abilities">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
<ColumnDefinition Width = "0.5*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Text = "{Binding Name}" />
<Label Text = "{Binding NbPower}" />
</Grid>
</DataTemplate>
Моя страница «PokemonView», представляющая мои две коллекции View на основе двух моих DataTemplates, одна для получения списка покемонов, а другая для получения способностей покемонов
<ContentPage.BindingContext>
<vm:PokemonViewModel></vm:PokemonViewModel>
</ContentPage.BindingContext>
<VerticalStackLayout>
<Label
Text = "{Binding Pseudo}"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
<Label Text = "Voici les pokemons disponible pour un match"></Label>
<!--Collectionview : qui contient mon template pour afficher une grid qui va contenir des pokémons
On peut en sélectionner un à la fois-->
<CollectionView
x:Name = "Pokemons"
ItemTemplate = "{StaticResource LstPokemons}"
ItemsSource = "{Binding ListPokemons}"
SelectionMode = "Single"
SelectedItem = "{Binding MonSelectedPokemon}">
</CollectionView>
<CollectionView
x:Name = "PokemonsAbilities"
ItemTemplate = "{StaticResource AbilitiesTemplate}"
ItemsSource = "{Binding AbilitiesSource}">
</CollectionView>
<!--Boutton pour passer a la page suivante une fois qu'il a séléctionné un pokémon-->
<Button x:Name = "btnValidate" Text = "Valider" Command = "{Binding ValidateSelected}"></Button>
</VerticalStackLayout>
</ContentPage>
Если вы имеете в виду конечную метку, вы не можете привязать список объектов к одной метке. Вам нужно либо использовать шаблонный элемент управления, либо добавить свойство к вашей виртуальной машине, которое будет возвращать одно строковое значение для коллекции.
У вас есть две или три разные вещи с именами Abilities
. Может быть, будет легче увидеть, что не так, если вы дадите им всем разные имена. Например. DataTemplate может быть AbilitiesTemplate
, источник, привязанный к ItemsSource, может быть AbilitiesSource
. Или, если это список покемонов, PokemonList
. Из показанного вами источника я не вижу, как используется lstPokemons
. Также сбивает с толку CollectionView x:Name = "Pokemons"
, у которого есть ItemsSource Abilities
. Что он? Это просмотр покемонов или просмотр способностей одного покемона? Не может быть и тем, и другим одновременно.
@Jason Да, я использую модель для своих способностей и другую модель для моего списка покемонов со списком способностей, чтобы иметь возможность получить окончательную информацию из моего списка покемонов. Какое свойство мне нужно добавить и где?
@JessieZhang-MSFT Да, я использую два dataTemplates: lstPokemons, которые представляют мой список покемонов, и Abilities, которые представляют способности покемонов, полученные из dataTemplates lstPokemons. Лучше поместить все в один dataTemplate или можно оставить 2? Я только что добавил свой код, представляющий страницу PokemonView с двумя моими коллекциями.
Вам нужно свойство в вашей модели, которое преобразует ваш список объектов Ability в строку, которую вы можете отобразить в метке.
public string AbilitiesDesc
{
get
{
return string.Join(",", Abilities.Select(a => a.Name));
}
}
Затем привяжите это новое свойство к метке
<Label
Text = "{Binding SelectedPokemon.AbilitiesDesc}"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
Для чего нужен «Выбор» и как его реализовать?
Это запрос LINQ. Добавьте «используя System.Linq;» в твой класс
Странно, я не могу реализовать это с помощью System.Linq, я могу просто сгенерировать метод
Код, который вы мне прислали, находится в скрытом коде или в представлении модели?
Это свойство вашей модели
если у вас все еще есть проблемы, вам необходимо предоставить конкретные сведения о проблеме и любых ошибках или исключениях, которые вы получаете
@ Джейсон Извините, я только что надел его