更新嵌套列表中父实例的值

时间:2016-07-21 06:21:51

标签: c# wpf

这可能是微不足道的。但我无法理解这一点。

public class Manager
{
    public int ID { get; set; }
    public List<Employee> Employees { get; set; }
    public bool IsAllEmpEngaged { get; set; }
    public void UpdateIsAllEmpEngaged()
    {
        IsAllEmpEngaged = Employees.All(emp => emp.IsEngagedwithWork == true);
    }

}

public class Employee
{
    public int ID { get; set; }
    public bool IsEngagedwithWork { get; set; }
}

因此,每当IsEngagedwithWork的{​​{1}}被设置为某个值时,我想检查Employee下的所有Employees是否与工作有关并更新相应Manager的{​​{1}}的值。

我只想就IsAllEmpEngaged的属性Manager中的更改致电UpdateIsAllEmpEngaged。我怎样才能做到这一点?

欢迎任何其他方式。

注意:我尝试在IsEngagedwithWork上使用Employee并附加event Employee,如果有任何更改,将会回调Action Manager财产。但我将有数百Employee。我不想为List<Manager>类的每个实例添加事件。有什么简单的方法吗?

更新

我正在使用WPF MVVM方法,我不能使用直接Employee,因为它不会通知UI。我必须手动get with LinQ属性进行更改,以便它set用户界面。

此外,在实际情况中,将在UI中为属性Notify更新IsEngagedwithWork。

5 个答案:

答案 0 :(得分:1)

简单的解决方案是将 ManagerId 添加到Employee模型类中,并在设置员工实例的IsEngagedwithWork(例如emp)的代码行之后,执行以下操作

Manager mngr = managers.Select(m => m.ID == emp.ManagerId).FirstOrDefault();

if(mngr != null)
 mngr.IsAllEmpEngaged = mngr.IsAllEmpEngaged && emp.IsEngagedwithWork;

答案 1 :(得分:1)

我会像那样使用属性的getter

 public bool IsAllEmpEngaged { 
   get {
       return (Employees != null) && 
                   Employees.All(e => e.IsEngagedwithWork)
   }
}

并为Manager Class

添加以下方法
 public void NotifyChanged() { OnPropertyChanged(() => IsAllEmpEngaged }

然后你从员工类中调用它(假设你有管理者列表或等效方式)

private int _ID;
private bool _IsEngagedwithWork;
public int ID { 
     get { return _ID}; 
     set {
       _ID = value;
       OnPropertyChanged(()=>ID );
       notifyMe = managerList.FirstOrDefualt(m => m.ID == _ID);
       if (notifyMe != null) { notifyMe.NotifyChanged()}
     } 
}
public bool IsEngagedwithWork { 
       get { return _IsEngagedwithWork ;} 
       set {
             _IsEngagedwithWork = value;
             OnPropertyChanged(()=>IsEngagedwithWork );
             notifyMe = managerList.FirstOrDefualt(m => m.ID == _ID);
             if (notifyMe != null) { notifyMe.NotifyChanged()}
       } 

}

答案 2 :(得分:0)

我会做什么:

  • 使IsAllEmpEngaged成为私人
  • 将集合Empoyess设为私有,并添加一个添加新员工的功能:
  • 添加添加新员工的功能。

现在有两个选择:

1)添加员工后,迭代集合并更新IsAllEmpEngaged属性

 public void AddNewEmployee(Employee employee){
    this.Employees.Add(employee);           
    bool all = true;

    foreach(Employee emp in this.Employees){
        if (!emp.IsEngagedwithWork){
            all = false;
            break;
        }
    }

    this.IsAllEmpEngaged = all;          
}

2)

  • 以IsAllEmpEngaged = true开头;当班级被引入并且收集为空时

  • 添加员工时,更新IsAllEmpEngaged属性,但保留最后一个选项的计数(仅当您不删除员工时才有效)

    public void AddNewEmployee(Employee employee){
        this.Employees.Add(employee);           
    
        this.IsAllEmpEngaged = this.IsAllEmpEngaged && employee.IsEngagedwithWork 
     }
    

答案 3 :(得分:0)

我不能说这更好,但这肯定是一种简单易行的方法。

为什么不让IsAllEmpEngaged成为一种方法呢?您甚至不需要set属性访问器,因此方法就足够了。

public bool IsAllEmpEngaged()
{
    if (Employees == null)
    {
        // throw error
    }

    return Employees.All(e => e.IsEngagedwithWork);
}

答案 4 :(得分:0)

当您将Manager作为参数传递给Employee然后在IsEngagedWithWork设置为true时调用您的Method时,它可能会工作。

[1 4 7]