Как сделать привязку в WPF MVVM к динамическому списку CheckBox?

Для привязки динамического списка CheckBox в WPF MVVM вы можете использовать коллекцию, которая содержит элементы, отображаемые в CheckBox, а также добавлять свойство в модель представления для отслеживания выбранных элементов.

1. Создайте класс для элемента списка CheckBox в модели представления, который будет содержать свойство для отслеживания выбранности элемента. Например:

public class CheckBoxItem : INotifyPropertyChanged
{
    private bool isChecked;
    public bool IsChecked
    {
        get { return isChecked; }
        set
        {
            isChecked = value;
            OnPropertyChanged(nameof(IsChecked));
        }
    }

    public string Text { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. В модели представления создайте коллекцию CheckBoxItem для хранения элементов списка CheckBox, а также свойство SelectedItems для отслеживания выбранных элементов. Например:

public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<CheckBoxItem> checkBoxItems;
    public ObservableCollection<CheckBoxItem> CheckBoxItems
    {
        get { return checkBoxItems; }
        set
        {
            checkBoxItems = value;
            OnPropertyChanged(nameof(CheckBoxItems));
        }
    }

    private List<CheckBoxItem> selectedItems;
    public List<CheckBoxItem> SelectedItems
    {
        get { return selectedItems; }
        set
        {
            selectedItems = value;
            OnPropertyChanged(nameof(SelectedItems));
        }
    }

    public ViewModel()
    {
        CheckBoxItems = new ObservableCollection<CheckBoxItem>();
        SelectedItems = new List<CheckBoxItem>();

        // Заполнение коллекции элементов списка CheckBox
        CheckBoxItems.Add(new CheckBoxItem { Text = "Item 1" });
        CheckBoxItems.Add(new CheckBoxItem { Text = "Item 2" });
        CheckBoxItems.Add(new CheckBoxItem { Text = "Item 3" });

        // Изменение выбранности элементов списка CheckBox
        SelectedItems.Add(CheckBoxItems[0]);
        SelectedItems.Add(CheckBoxItems[2]);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

3. В XAML-разметке создайте привязку для CheckBox, используя ItemsControl и DataTemplate. Например:

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApp"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>
    <Grid>
        <ItemsControl ItemsSource="{Binding CheckBoxItems}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Text}"
                              IsChecked="{Binding IsChecked, Mode=TwoWay}"
                              Margin="5" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

4. Запустите приложение и вы увидите список элементов CheckBox, которые можно выбирать. Когда пользователь выбирает или снимает флажок, соответствующее свойство в модели представления обновляется.

Таким образом, вы создали привязку динамического списка CheckBox к коллекции в модели представления, а также добавили функциональность для отслеживания выбранных элементов.