【问题标题】:Where to put business logic for a WPF Checkbox in DataGrid在 DataGrid 中放置 WPF 复选框的业务逻辑的位置
【发布时间】:2021-03-25 00:13:17
【问题描述】:

我在模型中有一个具有以下属性的类记录:

public class Record
{
     public string RecordID { get; set; }
     public string Status { get; set; }
     public string Profiler { get; set; }
     public bool IsChecked { get; set; }
}

在我的视图模型中,我从类中创建了一个列表,并从数据库中填充了它。此列表是我的 datagridview 的 itemsource,列绑定到 Record 类的属性:

  private List<Record> _recordList;

  public List<Record> RecordList
  {
        get { return _recordList; }
        set
        {
            _recordList= value;
            OnPropertyChanged("RecordList");
         }
  }

RecordList = new List<Record>();

我应该将 IsChecked 属性绑定到 Checkbox 的逻辑放在哪里?我是否在模型中放入 IsChecked 属性的设置器?

i在DataGrid(DV记录ID:ALL)中有一行,当检查其复选框时,还将根据特定条件在数据摩口检查/选择其他行。把它放在 setter 里安全吗?

【问题讨论】:

  • 你想实现什么样的逻辑?
  • @RobertHarvey 在这种情况下,当勾选了“所有”记录 ID 复选框的行时,它还会根据条件勾选其他行的复选框,同时将 IsChecked 属性更新为 true对应的项目。
  • 您是否在 RecordList 中添加了一个虚拟行来支持 Top most ALL 行?
  • @PrateekShrivastava 是的,该行是手动添加的以符合设计规范。
  • 我认为您可以在 VM 中使用一个命令来处理 CheckBox Checked。将 Binding 项作为参数传递给 Command。在 Command 方法中,您必须(脏)检查所有项目并对其做出反应(即循环通过 RecordList 并为所有项目设置 IsChecked True)。

标签: c# wpf mvvm


【解决方案1】:

您可以像这样将命令绑定到您的复选框:

<CheckBox Content="CheckBox"
      Command="{Binding CheckAllCommand}"
      CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}" />

然后在 Command 方法执行时为视图模型中的所有记录设置IsChecked

public void CheckAllItems(bool isChecked)
{
    foreach(var item in RecordList)
    {
        item.IsChecked = isChecked;
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 2016-01-18
    • 2013-01-10
    • 1970-01-01
    • 2017-04-02
    • 2019-05-22
    • 2012-08-09
    • 2019-05-14
    • 2021-01-11
    相关资源
    最近更新 更多