【问题标题】:Check/Uncheck all checkboxes using bindings instead of a loop?使用绑定而不是循环检查/取消选中所有复选框?
【发布时间】:2017-06-24 20:21:39
【问题描述】:

我在grid 中有一堆checkboxes。我有两个buttons,一个“全选”按钮和一个“取消全选”按钮。名称不言自明,但是当我单击“全选”按钮时,应选中所有复选框。当我点击“uncheck all”按钮时,所有的复选框都应该被取消选中。

现在,我可以创建一个命令来遍历每个复选框并选中/取消选中按钮,但我想知道是否有更简单的方法使用一些绑定。例如,我试过这个:

在 xaml 中:

<Grid>
    <CheckBox Grid.Row="1"
              Grid.Column="2"
              IsChecked="{Binding IsChecked}" />
    <CheckBox Grid.Row="2"
              Grid.Column="2"
              IsChecked="{Binding IsChecked}"/>
</Grid>

在我的视图模型中:

private bool _isChecked;
public bool IsChecked
{
    get { return _isChecked; }
    set { _isChecked = value; OnPropertyChanged("IsChecked"); }
}

上述方法不起作用,因为所有复选框都绑定到同一个布尔值。因此,选中/取消选中一个对所有这些都是一样的。但我想做这样的事情。有什么我没有想到的,还是循环遍历它们的主要方法?

【问题讨论】:

  • 考虑改写标题,当我阅读without a loop 部分时,我最初认为Bad question, of course you need a loop!。但是,以您尝试过的示例为例,这实际上是一个很好的问题。
  • 有不同的方法可以在没有迭代的情况下做你想做的事,但我不会告诉你 - 它会不必要地混淆你正在尝试做的事情。无需将切换复选框变成过于复杂的混乱
  • 我和@Dbl 在一起。为什么要将简单循环可以解决的问题过于复杂化?
  • 这将是违规行为。您应该在托管视图模型中使用命令来运行视图模型操作。如果您认为代码隐藏是必要的,您仍然应该查看更多教程。对于几乎每种情况,都有一个相当简单的基于视图模型+绑定的解决方案来解决您的问题
  • “将这个循环放在窗口的 xaml.cs 中会破坏 MVVM 模式吗?”。是的。您应该遍历源集合中的项目并设置数据对象的 IsChecked 属性。

标签: c# wpf checkbox mvvm


【解决方案1】:

ViewModel 方法运行良好

private bool _isChecked;
public bool IsChecked
{
    get { return _isChecked; }
    set { _isChecked = value; OnPropertyChanged("IsChecked"); }
}

关键是您还必须定义与ItemsSource 的绑定(这相当于循环)和具有此类IsChecked 属性的对象集合。这样每个复选框将独立启用和禁用

【讨论】:

  • 你有机会展示一个小例子吗?我主要关心的是布局。复选框现在在一个网格中,其中 9 个总共以 3x3 布局方式。如果我使用 ItemsSource,我将如何正确排列它们?我可以在对象上放置一个“int”属性,然后将 grid.row/column 绑定到该属性吗? (如果可能,无需示例)。
  • 刚刚测试过,可以了:)谢谢!
【解决方案2】:

有什么我没有想到的,还是只是循环遍历它们的主要方法?

不是和是。您应该使用循环来迭代源集合中的所有项目,并将它们的 各自 IsChecked 属性设置为 true。

显然,如果您希望能够单独选中和取消选中每个 CheckBox,则不能将所有 CheckBox 绑定到单个源属性并简单地设置它。

除了使用某种循环之外,没有其他或更好的方法可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多