更新复选框列表

时间:2018-12-07 11:27:27

标签: c# wpf list checkbox mvvm

我有一个list<Month> months,其中包含12个对象,它们的名称字符串具有月份的名称(例如januari),还有一个list<Month> selectedMonths,我想添加到该月份中由用户选中一个复选框,并在未选中该复选框时将其删除。

在XAML中,我有:

<StackPanel>
  <CheckBox IsChecked="{Binding monthCheck}" Content="Januari"/>
  <CheckBox IsChecked="{Binding monthCheck}" Content="Februari"/>
  [etc...]
  <CheckBox IsChecked="{Binding monthCheck}" Content="November"/>
  <CheckBox IsChecked="{Binding monthCheck}" Content="December"/>
</StackPanel>

现在在我的视图模型中,我有:

private bool _monthCheck;
public bool monthCheck{
get{ return _monthCheck; }
set{
   _monthCheck = value;
   OnPropertyChanged("maandCheck");
   }

现在,如果我单击任何一个复选框,则所有12个复选框都将随着我单击的复选框而发生变化(可以理解,它们都绑定到同一个bool);我希望当我勾选一个框时,它会选中复选框Content,并将相应的月份从months添加到selectedMonths。 我该怎么办? 我可以仅使用monthCheck设置器中的代码来执行此操作吗?像这样:

set{
   _montcheck = value;
   if(value){
      somehow get Content
      select month with name = content from months
      selectedMonths.add(thatMonth)
      only check the appropriate box
   }

   if(!value){
      somehow get Content
      select month with that name
      selectedMonths.remove(thatMonth)
      only uncheck the appropriate box
   }
   OnPropertyChanged("maandCheck");
}

不确定我该怎么做。

1 个答案:

答案 0 :(得分:1)

您的视图模型应该具有一个Month对象的集合,视图中的ItemsControl可以绑定到这些对象:

<ItemsControl ItemsSource="{Binding Months}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

视图模型,其方法返回选定的月份:

public class Month
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

public class ViewModel
{
    public List<Month> Months { get; } = new List<Month>
    {
        new Month { Name="January" },
        new Month { Name="February" },
        new Month { Name="March" },
        new Month { Name="April" },
        new Month { Name="May" },
        new Month { Name="June" },
        new Month { Name="July" },
        new Month { Name="August" },
        new Month { Name="September" },
        new Month { Name="October" },
        new Month { Name="November" },
        new Month { Name="December" },
    };

    public IEnumerable<Month> SelectedMonths
    {
        get { return Months.Where(m => m.IsSelected); }
    }
}

此示例缺少一种机制,该机制实际上向UI通知了选定月份的集合的更改,但是从这个问题尚不清楚这是否是必需的。