0

Есть Listbox, которому привязана коллекция, которая в свою очередь берёт данные из БД. Проблема в том что у меня не выходит вывести все данные определенного ListBoxItem из ViewModel. Знаю что для этого необходимо использовать ICommand, но пока не дошло как это сделать.

Вот код Xaml:

                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <WrapPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Margin="0,15,30,0">
                                    <Border BorderBrush="#242424" BorderThickness="0,0,0,1" >
                                        <Grid Margin="0,0,0,10" Width="370">
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="45"/>
                                                <ColumnDefinition Width="50"/>
                                                <ColumnDefinition Width="auto"/>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="45"/>
                                            </Grid.ColumnDefinitions>
                                            <Button Background="{x:Null}" BorderThickness="0">
                                                <Image Source="\Resources\img\sys\play.png" Width="25" Height="25"/>
                                            </Button>
                                            <Image Source="{Binding Image}" HorizontalAlignment="Left" Grid.Column="1" Width="35" Height="35">
                                                <Image.Clip>
                                                    <RectangleGeometry RadiusX="3" RadiusY="3" Rect="0,0,35,35"/>
                                                </Image.Clip>
                                            </Image>
                                            <TextBlock Grid.Column="2" Text="{Binding Musician}" Margin="0,0,10,0" Foreground="#fff" FontSize="16" VerticalAlignment="Center" FontFamily="\Resources\fonts\Montserrat-Regular.ttf #Montserrat"/>
                                            <TextBlock Grid.Column="3" Text="{Binding Song}" Foreground="#837979" FontSize="14" VerticalAlignment="Center" FontFamily="\Resources\fonts\Montserrat-Regular.ttf #Montserrat"/>
                                            <TextBlock Grid.Column="4" Text="3:23" Foreground="#fff" FontSize="14" VerticalAlignment="Center" FontFamily="\Resources\fonts\Montserrat-Regular.ttf #Montserrat"/>
                                        </Grid>
                                    </Border>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>

Не судите строго на счёт xaml, позже исправлю.

Здесь сама ViewModel:

                using (SqlCommand command1 = new SqlCommand(call_album_all, connection))
                {
                    int id_album = 2;
                    connection.Open();
                    command1.Parameters.AddWithValue("@id_album", id_album);
                    SqlDataReader reader = command1.ExecuteReader();
                    songs = new ObservableCollection<Models.Songs>();
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            songs.Add(new Models.Songs
                            {
                                ID = reader.GetInt32(0),
                                Image = byteArrayToImage((byte[])reader.GetValue(1)),
                                Musician = reader.GetString(2),
                                Album = reader.GetString(3),
                                Song = reader.GetString(4),
                                String_Song = reader.GetString(5),
                                Video = reader.GetString(6),
                                String_Video = reader.GetString(7)
                            });
                        }
                    }
                }

Вот то что на скриншоте это и есть та самая 2-ка из ViewModel, а мне как выше писал нужно чтобы инфа была только своя

введите сюда описание изображения

  • А почему у вас VM слой отвечает за базу? Ведь данные это какой слой? Правильно, это Model. – EvgeniyZ Apr 11 '21 at 16:02
  • @EvgeniyZ не совсем понял, то есть то что у меня вы считаете Model, а данные должны вызываться в другом? Если это так, то чо необходимо сделать, чтобы работало как по заплонированному? – Astronaut Pavel Apr 11 '21 at 16:08
  • Ну как "запланировано" я до сих пор не понял, уж извините, для меня ваше объяснение весьма неинформативным кажется, из-за чего я затрудняюсь сказать вам что-либо годного. А Model... Вот вы пишете Здесь сама ViewModel:, там код, где вы соединяетесь с базой (= new SqlCommand...), выполняете команду (command1.ExecuteReader();), далее заполняете коллекцию моделей (new ObservableCollection<Models.Songs>();) данными, и тут собственнов вопрос, почему это в ViewModel слое? В слое, который отвечает за обработку UI команд, за привязку и так далее, но не за данные... – EvgeniyZ Apr 11 '21 at 16:13
  • MVVM это что? Это слои: View - интерфейс (то, что видит пользователь), всякие кнопочки. Model - данные (работа с базой, чтение файла, отправка HTTP запросов, может быть датчик какой-либо погодный или что-либо еще), то есть это слой, который имеет логику по работе с определенным источником, он имеет органы управления, которые дают наружу данные, ну либо он, наоборот, принимает данные для изменений их в "базе". ViewModel - это связующий слой, который берет запрос с UI, обрабатывает его, спрашивает у M слоя нужные данные, преобразует их в нужный вид для привязки и отдает публичные свойства. – EvgeniyZ Apr 11 '21 at 16:17
  • @EvgeniyZ Достаточно хорошее объяснение, читал у других понять по путю так и не мог, но вам спасибо. Хорошо, как я понял в Model нужно прописывать слой отвечающий за данные. Пока что у меня в Model только то что отвечает за привязку коллекции. Есть какие-нибудь статьи или что-то в этом духе описывающюю эти все моменты? Так и всё же если в Model прописывать, то что вам необходимо знать, чтобы помочь в этом? – Astronaut Pavel Apr 11 '21 at 16:24
  • У вас должно быть что-то по типу такого: Класс, отвечающий за базу, у него стандартные публичные методы Get(), Update(), Delete(), то есть он отвечает только за работу с базой, а наружу у него удобные методы управления. Далее VM слой инициализирует эту модель и по действию в UI (команда или что либо еще), дергает те самые методы модели, получая нужные данные. Так, как для UI зачастую требуются не все данные для отображения (например внутренний какой либо код, ссылка, id или еще что), а также еще и может появится своя логика (например "IsSelected"), то – EvgeniyZ Apr 11 '21 at 16:33
  • делается класс обертка, которая имеет это все необходимое и при получение Model класса, создается его аналог, но ViewModel класс, который уже и привязывается. С обновлением/удалением данных в модели, делается все обратное, ищется по ID допустим объект и ему присваюваются текущие данные VM класса. Есть какие-нибудь статьи - посоветовать что-либо не могу, это такая тема, которую надо долго мучать, чтоб познание пришло само) что вам необходимо знать - я не понимаю, что вы хотите и в чем ваша проблема. Сейчас я вам просто говорю про то, что у вас не совсем верный MVVM, не более. – EvgeniyZ Apr 11 '21 at 16:36
  • @EvgeniyZ Можно ещё дополнительно пример небольшой к вашему объяснению? – Astronaut Pavel Apr 11 '21 at 16:36
  • @EvgeniyZ Попробую объяснить по лучше. По сути в программе при нажатии на альбом например первый, показывается именно информация о нём, то есть данные вытащенные из БД того самого альбома, так же при нажатии на второй альбом информация об альбоме именно о нём и не боллее. Как-то так, не могу сказать лучше ли объяснил – Astronaut Pavel Apr 11 '21 at 16:41
  • Пример - ну самое базовое я описывал здесь, заметьте, что данные про студентов там в отдельном классе (некая имитация базы со своими методами). По поводу вопроса, в чем сейчас тогда проблема не пойму? Ок, я так понимаю "альбомы" у вас в виде списка, то есть ListBox, если да, то просто привяжите SelectedItem к VM свойству и в его Set укажите логику подгрузки новых данных из базы. – EvgeniyZ Apr 11 '21 at 16:46
  • @EvgeniyZ Тогда выходит просто заместо ItemSource использвать SelectedItem? – Astronaut Pavel Apr 11 '21 at 16:50
  • ItemsSource - это источник данных, те данные, от куда контрол пытается отобразить данные. А SelectedItem - это текущий выбранный объект. И если я правильно понял, вам надо по клику на объект в ListBox начать подгружать данные из базы, чтоб их вывести. Ну вот, по клику (выбору) объекта, у вас изменится привязанный SelectedItem, по которому вызывайте нужную логику обновления, которая загрузит новые данные и отобразит их. Если в тот же ListBox, то у вас уже привязана коллекция должна быть, просто очищайте ее и циклом добавяйте новое, ну или =new... (), только про INPC не забудьте. – EvgeniyZ Apr 11 '21 at 16:53
  • @EvgeniyZ Попробую, но не факт что выйдет, потому что до сих не пришло понимание – Astronaut Pavel Apr 11 '21 at 16:57

0 Answers0