【问题标题】:Update list on checking boxes更新复选框列表
【发布时间】:2018-12-07 20:36:24
【问题描述】:

我有一个 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 setter 中的代码来做到这一点吗?比如:

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");
}

不知道该怎么做。

【问题讨论】:

  • 好吧,你只需要制作 12 个布尔值,就像你在这里做的一样

标签: c# wpf list checkbox mvvm


【解决方案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 所选月份集合的变化,但从问题来看,不清楚是否需要这样做。

【讨论】:

  • 您能否详细说明您的代码的作用?我对 C# 和 WPF 还是比较陌生。至于需要通知UI; month 类包含几个与该月气候相关的变量(即平均温度、风速) - 当用户点击按钮时,应用程序必须遍历选定的月份并使用数据进行一系列计算那几个月。我已经设置并工作了该部分,只需要完成它以便迭代的月份列表工作。
  • @Clemens 老实说,你的答案比我的好 100%,但对于从 WPF 开始的人来说,我觉得有点难以理解。
  • 它将 ItemsControl 绑定到 Month 对象的集合。 ItemTemplate 中的元素绑定到集合的各个项目。有关所有详细信息,请参阅Data Templating Overview
  • @Siegfried.V 那是完全错误的。您的回答只是表明根本不应该这样做。如果你学习 WPF,使用 ItemsControls 是必不可少的。
  • @Clemens 我已经更新了我的澄清请求。欢迎提供更多建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2013-10-23
  • 2017-01-02
  • 1970-01-01
  • 2022-01-12
  • 2019-02-02
相关资源
最近更新 更多