Вы хотите отделить свои проблемы здесь.
Ваша модель будет иметь такую структуру:
public class GroupBoxCollection
{
public List<GroupBoxContent> Collections { get; set; }
}
public class GroupBoxContent
{
public string GroupBoxName { get; set; }
public List<GroupBoxItem> Items { get; set; }
}
public class GroupBoxItem
{
public string ItemName { get; set; }
public bool IsChecked { get; set; }
}
И ваш XAML будет выглядеть примерно так. Я не использую GroupBoxes здесь, потому что SL4 не имеет их по умолчанию. Вместо этого я буду использовать Grid, но вы можете изменить код, чтобы использовать их самостоятельно:)
<ListBox x:Name="TestListBox" ItemsSource="{Binding Collections}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5" Background="Azure">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Text="{Binding GroupBoxName}" />
<ListBox Grid.Row="1" ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}" Content="{Binding ItemName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
А в коде вы можете сделать что-то вроде:
TestListBox.DataContext = [an instance of GroupBoxCollection here];
Конечно, вы можете сделать это с помощью стилизации / шаблонов, как вы хотите, и, возможно, используя что-то, кроме ListBoxes, но это общая идея.
Примечание:
Вам также может понадобиться, чтобы ваша модель реализовала INotifyPropertyChanged и / или использовала ObservableCollection вместо List в зависимости от ваших потребностей. Вам также может понадобиться использовать привязку данных TwoWay, если вы хотите, чтобы ваш вид изменил вашу модель, когда пользователь устанавливает или снимает какие-либо флажки.
Если вы хотите проверить мой пример как есть , чтобы увидеть, что произойдет, убедитесь, что вы заполнили свой экземпляр GroupBoxCollection (который вы задали как DataContext of TestListBox) * за 1024 * до , который вы установили это как DataContext.