@Vladlen234
Wpf и asp .Net Core - топ

Как обратиться к ListBox из кода?

У меня есть ListBox в разметки, и через код туда надо добавлять AnimeListBoxItem. AnimeListBoxItem - это обычный ListBoxItem, только он имеет дополнительные свойства.
Вот функция добавления.
Код
internal static void Create(string Name, string Raiting, ListBox listBox)
        {
            AnimeBoxItem item = new AnimeBoxItem();
            listBox.Items.Add(item);
            item.AnimeName = Name;
            item.Raiting = Raiting;
        }

631b7b05233f2995932779.png
Чтобы AnimeListBoxItem был именно в нужном ListBox, надо добавить его в этот ListBox. Для этого и нужно через компонент обратиться к его свойству Items. Потому что это свойство недоступно для привязки со стороны разметки. По этому как можно привязать не конкретное свойство, а весь контрол.
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вам не нужно делать кастомный контрол для листбокса, такое поведение делается по другому:
1) создаётся класс Anime, в котором нужно указать необходимые свойства аниме - Название, рейтинг, автор, серия, ссылка на скачивание и пр.
2) создаётся вьюмодель окна (или части окна),
2.1) во вьюмодели нужно сделать коллекцию объектов аниме (можно и List, но лучше ObservableCollection)
3) вьюмодель указывается в окно как датаконтекст (тут есть несколько вариантов, ниже покажу самый прсотой вариант)
4) привязать коллекцию аниме к списку ListBox, и указать имя свойства для показа (тут, видимо - Название).
5) всё, список готов - будет видно в окне. Осталось получить конкретный элемент и его свойства - объект класса Anime указано в свойстве DataContext элемента списка (ListBoxItem) и остаётся привести к нужному классу:
var anime = (Anime)AnimeListBox.Items.First().DataContext;
Console.WriteLine(anime.Name + " " + anime.Rating);

class Anime
{
    public string Name {get; set;}
    public double Rating {get; set;}
    public string Author {get; set;}
    public string Serie {get; set;}
    public string Url {get; set;}
}
class AnimeListViewModel
{
    public ObservableCollection<Anime> AnimeList {get; set;} = new ObservableCollection<Anime>
    {
        new Anime { Name = "Наруто",  Rating = 5, Author = "Масаси Кисимото"},
        new Anime { Name = "Стальной алхимик",  Rating = 5, Author = "Хирому Аракава"},
        new Anime { Name = "X",  Rating = 5, Author = "CLAMP"},
    };
}


<Window ...
    xmlns:app="clr-namespace:Anime">
    <Window.DataContext>
        <app:AnimeListViewModel/>
    </Window.DataContext>
    <Grid>
        <ListBox ItemsSource="{Binding AnimeList}"
                 DisplayMemberPath="Name"/>
                 x:Name="AnimeListBox"/>
    </Grid>
</Window>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы