В простейшем случае это должно выглядеть где-то так:
XAML:
<ListBox x:Name="lst">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Value}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
В коде, например:
lst.ItemsSource = new List<KeyValuePair<int, string>>()
{
new KeyValuePair<int, string>(1, "1"),
new KeyValuePair<int, string>(2, "2"),
};
Данный код покажет вам ваш список с чекбоксиками. К чекбоксу можно привязать событие на изменение и отлавливать какой элемент зачекили или расчекили.
При желании можно получить список отмеченных, но это не так тривиально.
Лучше использовать для отображения объект у которого есть логическое свойство, например IsChecked, и его привязать к IsChecked CheckBox.
Например:
Класс:
class MyClass
{
public int id { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
}
XAML:
<ListBox x:Name="lst">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Добавление элементов:
lst.ItemsSource = new List<MyClass>()
{
new MyClass(){id=1, Name="1"},
new MyClass(){id=2, Name="2"},
};
В таком случае отметка пользователем галочки сразу отражается в привязанном списке и можно легко получить список отмеченных:
foreach(var tObj in (lst.ItemsSource as List<MyClass>).Where(myObj => myObj.IsChecked))
MessageBox.Show(tObj.Name);