Задать вопрос
@Smiz001
C#-developer

Как группу CheckBox прибиндить к одному свойcту во ViewModel?

Суть проблема такова.
У меня есть группа CheckBoxов
7e917c697a8f4e09baeb47f1c45206eb.png
Как мне сделать для них одно свойство? Реализация свойства подразумевает в себе то, что если галку поставили на CheckBox то в List добавляется определенный объект, галочку снимают, объект удаляется из List.
Просто не хочется плодить под каждый CheckBox свою обработку. Есть ли способы реализации подобных проблем?
  • Вопрос задан
  • 488 просмотров
Подписаться 3 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
AngelOfSnow
@AngelOfSnow
Embedded software engineer
private void xx_Click(object sender, EventArgs e)
{
    CheckBox ch = sender as CheckBox;
    // делайте с вашим конкретным checkbox что хотите
}


sender это и есть тот объект, на котором произошло событие, если я правильно понял ваши желания.
Ответ написан
@Sumor
Во ViewModel свойство "дни недели" и ссылки для каждого дня недели для добавления и удаления в список:
private List<System.DayOfWeek> _dayWeeks = new List<System.DayOfWeek>();
public List<System.DayOfWeek> DayWeeks
{
  get{return _dayWeeks;}
}

public bool HasMonday
{
  get{ return _dayWeeks.Any(d => d  == DayOfWeek.Monday);}
  set
  {
    if(value && !HasMonday)
    {
      _dayWeeks.Add(DayOfWeek.Monday);
      OnPropertyChanged("DayWeeks");
      OnPropertyChanged("HasMonday");     
    }
    if(!value && HasMonday)
    {
      _dayWeeks.Remove(DayOfWeek.Monday);
      OnPropertyChanged("DayWeeks");
      OnPropertyChanged("HasMonday");     
    }
  }
}
// Дальше аналогично для других дней недели

Могут быть нюансы с добавлением/удалением из списка от того, что DayOfWeek это enum. Нет возможности сейчас проверить.

Есть другой вариант. Создать своё представление дней недели по битам байта: Понедельник - 1, Вторник - 2, Среда - 4, Четверг - 8, Пятница - 16, Суббота - 32, Воскресенье - 64
Тогда свойство DayWeeks должно по get генерить List на основе битов. А свойства HasMonday и т.п. будут взводить/сбрасывать соответствующий бит.
Ответ написан
@Smilleey
Может что-то вроде такого:
<Grid DataContext="{Binding SelectedDaysObj}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <StackPanel Orientation="Vertical" >
            <CheckBox Content="Mo" IsChecked="{Binding Mo}"/>
            <CheckBox Content="Tu" IsChecked="{Binding Tu}"/>
            <CheckBox Content="We" IsChecked="{Binding We}"/>
            <CheckBox Content="Th" IsChecked="{Binding Th}"/>
            <CheckBox Content="Fr" IsChecked="{Binding Fr}"/>
            <CheckBox Content="Sa" IsChecked="{Binding Sa}"/>
            <CheckBox Content="Su" IsChecked="{Binding Su}"/>
        </StackPanel>
        <ListBox Grid.Column="1" ItemsSource="{Binding DaysOfWeek}"/>
    </Grid>


public partial class MainWindow
    {
        public SelectedDays SelectedDaysObj { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            SelectedDaysObj = new SelectedDays()
            {
                Mo = true, Fr = true, Sa = true
            };
        }
        public class SelectedDays : INotifyPropertyChanged
        {
            public SelectedDays()
            {
                _daysOfWeek = new ObservableCollection<DayOfWeek>();
            }
            private bool _mo;
            private bool _tu;
            private bool _we;
            private bool _th;
            private bool _fr;
            private bool _sa;
            private bool _su;
            private ObservableCollection<DayOfWeek> _daysOfWeek;

            public bool Mo
            {
                get => _mo;
                set
                {
                    _mo = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Monday)) DaysOfWeek.Add(DayOfWeek.Monday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Monday)) DaysOfWeek.Remove(DayOfWeek.Monday);
                    }
                }
            }
            public bool Tu
            {
                get => _tu;
                set
                {
                    _tu = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Tuesday)) DaysOfWeek.Add(DayOfWeek.Tuesday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Tuesday)) DaysOfWeek.Remove(DayOfWeek.Tuesday);
                    }
                }
            }
            public bool We
            {
                get => _we;
                set
                {
                    _we = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Wednesday)) DaysOfWeek.Add(DayOfWeek.Wednesday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Wednesday)) DaysOfWeek.Remove(DayOfWeek.Wednesday);
                    }
                }
            }
            public bool Th
            {
                get => _th;
                set
                {
                    _th = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Thursday)) DaysOfWeek.Add(DayOfWeek.Thursday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Thursday)) DaysOfWeek.Remove(DayOfWeek.Thursday);
                    }
                }
            }
            public bool Fr
            {
                get => _fr;
                set
                {
                    _fr = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Friday)) DaysOfWeek.Add(DayOfWeek.Friday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Friday)) DaysOfWeek.Remove(DayOfWeek.Friday);
                    }
                }
            }
            public bool Sa
            {
                get => _sa;
                set
                {
                    _sa = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Saturday)) DaysOfWeek.Add(DayOfWeek.Saturday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Saturday)) DaysOfWeek.Remove(DayOfWeek.Saturday);
                    }
                }
            }
            public bool Su
            {
                get => _su;
                set
                {
                    _su = value;
                    OnPropertyChanged();
                    if (value)
                    {

                        if (!_daysOfWeek.Contains(DayOfWeek.Sunday)) DaysOfWeek.Add(DayOfWeek.Sunday);
                    }
                    else
                    {
                        if (_daysOfWeek.Contains(DayOfWeek.Sunday)) DaysOfWeek.Remove(DayOfWeek.Sunday);
                    }
                }
            }
            public ObservableCollection<DayOfWeek> DaysOfWeek
            {
                get => _daysOfWeek;
                set
                {
                    _daysOfWeek = value;
                    OnPropertyChanged();

                }
            }
            #region inpc
            public event PropertyChangedEventHandler PropertyChanged;
            [NotifyPropertyChangedInvocator]
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
            #endregion

        }
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы