属性 C# 的更改事件..父子交互

Property Change Event for C# ..Parent child interaction

我有一个 class 存储任务列表的步骤 :

public class Step
    {

        public string StepName { get; set; }

        private string _stepStatus 

        public List<Task> Tasks { get; set; }

    public string StepStatus
    {
        get
        {
            return _stepStatus;
        }
        set
        {
            _stepStatus = value;
        }  
   }

        public Step(String name)
        {
            StepName = name;

            Tasks = new List<Task>();

        }

我有一个 class 任务:

  public class Task
    {

    public string TaskName { get; set; }

    private string _taskStatus 
    public string TaskStatus
    {
        get
        {
            return _taskStatus;
        }
        set
        {
           // raise an event here
            _taskStatus = value;
        }  
   }
    public Task(String name)
    {
        TaskName = name;

    }

每当有人更新任务时,我都想引发一个事件。此事件应由父级捕获,即 Step .. Step 应检查所有任务的状态。

如果所有任务的状态都是 New ,那么 Step status 应该自动设置为 New 。 如果所有任务的状态都是 Finished ,那么 Step 状态应该自动设置为 Finished 。 如果即使有一个任务的状态为 In Progress ,也应将 Step Status 设置为 In Progress 。 我将调用此方法 TripleLogic ,比如说。

以上三点逻辑我都可以做,因为这是合乎逻辑的。我不确定如何从 Task Status setter 引发事件并确保 Step class 对象选择它,因为我是 C# 的新手。如果有人可以通过一个小示例代码帮助我解决此事件引发部分,并告诉我如何让我的父 Step 对象捕获此事件并在该实例中调用 TripleLogic。

我查看了 INotifyPropertyChanged 但不确定如何实施。 任何其他与代码设计相关的指针都会有所帮助。

第一个建议是不要在 Step class 上公开您的 Tasks 属性,这样消费者就无法修改集合 whenever/however 他们想。而是将一个名为 AddTask(Task t) 的方法添加到 Step,然后您可以在其中设置事件处理。

Task class 应该公开一个事件,也许叫做 StatusChanged。当调用 TaskStatus 属性 上的 setter 时,触发该事件(在检查以确保有侦听器之后)。此事件的参数应包括更新状态和任务名称。如果您有一组有限的状态,我建议为它们定义一个枚举,而不是依赖字符串。

示例:

public class Task
{
    public event EventHandler<TaskStatusEventArgs> StatusChanged;
    //...
}

public enum TaskStatus
{
    New,

    InProgress,

    Done
}

public class TaskStatusEventArgs: EventArgs
{
    public string TaskName { get; private set; }

    public TaskStatus Status { get; private set; }

    public TaskStatusEventArgs(string taskName, TaskStatus status)
    {
        TaskName = taskName;
        Status = status;
    }
}

返回 StepAddTask() 方法,订阅 TaskStatusChanged 事件并跟踪 [=13] 中的任务数=].在 StatusChanged 事件的处理程序中,您可以获取任务的新状态并在 TripleLogic() 方法中执行您需要的任何逻辑。

示例:

public class Step
{
    List<Task> tasks;

    public void AddTask(Task t)
    {
        t.StatusChanged += HandleStatusChanged;
    }

    private void HandleStatusChanged(object sender, TaskStatusEventArgs args)
    {
        string taskName = args.TaskName;
        TaskStatus status = args.Status;

        TripleLogic(taskName, status);
    }
}

鉴于您提到您是 C# 的新手,或许可以浏览 MSDN guide for events, specifically the sections on subscribing and publishing。发布部分提到了通用 EventHandler<TEventArgs> 委托,我强烈建议使用该方法。

你的问题含糊不清,而且太大了,再加上你缺乏语言经验,这可能需要一段时间才能解决。