Hello! As I said in my post's comments, I actually found the solution thanks to the lead Sir Rufo gave me about item templates, and KettuJKL's answer as well.
To anyone going through this post looking for the same answer:
In order to create a ListView with CheckBoxes, TextBlocks and whatnot in C# WPF, there's a few simple steps that you have to (could?) take:
Firstly, create a class in your .cs file with properties that get/set each of the controls' values that your ListView needs. An example of this usage as in my Media Player is shown below:
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
}
Secondly, add the ListView in question to your program with XAML. Create the ListView with the following code:
<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>
Lastly (and finally), instead of directly adding new entries to your ListView, you need to add items to a list that stores every row's values as a new entry. Whenever you need to update the ListView, you need to set the list as an ItemsSource to the ListView. As shown below:
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.
}
And finished!
That's all you need to create a ListView with columns representing different values and holding different controls.