2016-12-24 1 views
2

В настоящее время я создаю MP3-плеер в C# WPF. У моего MP3-плеера есть ListView сбоку, который показывает полный текущий список воспроизведения, позволяющий пользователю выбрать песню или позволить MP3-плееру прокручивать песни. В настоящее время я пытаюсь реализовать следующую функцию:C# WPF - Как иметь CheckBoxes в ListView?

Наличие CheckBox рядом с каждым элементом. Когда текущая песня будет закончена, если следующая песня IsChecked, затем воспроизведите ее, иначе пропустите ее.

Я много искал для ответа, который мне подходит, однако все, что я, кажется, нахожу, - это ответы, которые не имеют для меня смысла, поэтому я не могу реализовать их в соответствии с моей программой.

Я понятия не имею, как реализовать эту функцию.

Поскольку песни загружаются из openFileDialog, я не могу найти способ программно добавлять CheckBoxes ко всем элементам в ListView.

Кроме того, я попытался использовать элемент управления CheckListBox с расширенным набором инструментов Wpf Extended, но это не подходит, так как многие события и/или свойства этого элемента управления не совпадают с ListView, и некоторые из них недоступны, такие как «Revert Song Change» (воспроизведение предыдущей песни до времени, когда пользователь ее изменил), или функцию для загрузки тех же песен, что и при закрытии программы.

Если кто-то может привести меня к ответу или объяснить это мне простым способом, мы будем очень благодарны.

Спасибо за помощь.

+0

Вы можете проектировать презентацию, как вам нравится, с помощью флажков, колоколов и свистов. Обратите внимание на ItemTemplate –

+0

Возможный дубликат [WPF Listview Checkboxcolumn Binding] (http://stackoverflow.com/questions/24528809/wpf-listview-checkboxcolumn-binding) –

+0

Спасибо большое сэр Руфо! Я на что-то, мне удалось установить флажки. Если это сработает, я опубликую решение для тех, кто смотрит в эту тему в будущем. –

ответ

2

Здравствуйте! Как я уже сказал в комментариях моего сообщения, Я действительно нашел решение благодаря тому, что руководство Sir Rufo дало мне о шаблонах товаров, а также ответ KettuJKL.

Для тех, кто собирается через этот пост ищет тот же ответ:

Для того, чтобы создать ListView с CheckBoxes, TextBlocks и этажерки в C# WPF, есть несколько простых шагов, которые вы должны (могут?) Принимают:

Во-первых, создать класс в ваших .cs файл с свойства что получить/установить каждое из значений по контролирует, что ваши потребности ListView. Примером такого использования, как в моем медиаплеера показано ниже:

public class Song //Class name - could be anything, so long as it suits you 
{ 
    public bool Favourite { get; set; } //Value for CheckBox #1 - whether it is a favourite 
             //(true - checked) or not (false - unchecked) 
    public bool Play { get; set; } //Value for CheckBox #2 - whether the song is played 
            //when its turn is reached (true - play/false - skip) 

    public string Name { get; set; } //A string value of the name of the song 
} 

Во-вторых, добавить ListView в вопрос к вашей программе с XAML. Создание ListView с помощью следующего кода:

<ListView Grid.Row="2" HorizontalAlignment="Stretch" Name="MyListView" 
Margin="5" SelectionChanged="SelectedSongChanged" Grid.RowSpan="2"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Favourite"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Margin="5, 0" IsChecked="{Binding Favourite}"/> 
           <!-- Your control type and value goes here. Bind the value 
            to the name of the method that represents this value 
            in your .cs file. In my case, this was 'Favourite' --> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Play"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <CheckBox Margin="5, 0" IsChecked="{Binding Play}"/> 
           <!-- Repeat this for every control you need in your 
            ListView's rows --> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Name"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Margin="5, 0" Text="{Binding Name}"/> 
           <!-- You can add non-binded values too to each column. 
            These values will simply be added to every row 
            and be the same. --> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 

Наконец (и, наконец), вместо непосредственного добавления новых записей в вашей ListView, вам нужно добавить элементы в список, который хранит значения каждой строки в качестве новой записи , Всякий раз, когда вам нужно обновлять ListView, вам нужно установить список в качестве элемента ItemsS ListView. Как показано ниже:

private void AddSong() 
{ 
    List<Song> playlistSongs = new List<Song>(); //Set a list that holds values of your 
               //class' type. If you made a class 
               //called 'MyClass', your list would 
               //be List<MyClass> instead. 

    playlistSongs.Add(new Song() { Favourite = false, Play = true, Name = "Song 1"); 
    //Add a new song to the list of songs. Each value in the class is represented 
    //as above. You can change these values to be different, or even calculated 
    //depending on variables. 

    MyListView.ItemsSource = playlistSongs; //Finally, set each row's values in your 
              //ListView equivalent to each entry 
              //in your list created earlier. 

} 

И закончен!

Это все, что вам нужно для создания ListView с столбцами, представляющими разные значения и имеющими различные элементы управления.

1

В решении StackOverflow ListView CheckBox есть несколько проблем. See some of them.

Простой пример можно найти from the MSDN.

Короче:

  1. Вы должны DataTemplate, содержащие флажок.
  2. Вам необходимо привязать этот флажок к свойству, чтобы управлять его значением.

Надеюсь, вы используете MVVM, который поможет связать свойства флажка.