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



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

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

我有一类任务:

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

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

如果所有任务的状态均为"新建",则"步骤状态"应自动设置为"新建"。 如果所有任务的状态均为"已完成",则步骤状态应自动设置为"已完成"。 如果任务的状态为"正在进行",则"步骤状态"应设置为"进行中"。 我将这种方法称为TripleLogic,比如说。

我可以为上述三个做逻辑,因为这是合乎逻辑的。我不确定如何从任务状态设置器引发事件并确保 Step 类对象拾取它,因为我是 C# 的新手。如果有人可以用一个小的示例代码帮助我解决此事件,并告诉我如何让我的父 Step 对象捕获此事件并在该实例调用 TripleLogic。

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

第一个建议不是不公开Step类上的Tasks属性,以便使用者无法随时随地/以他们想要的方式修改集合。而是添加一个名为AddTask(Task t)的方法Step您可以在其中设置事件处理。

Task类应该公开一个事件,可能称为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事件并跟踪Step中的任务数。在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 事件指南,特别是有关订阅和发布的部分。发布部分提到了通用EventHandler<TEventArgs>委托,我强烈建议使用该方法。

你的问题很模糊,而且足够大,再加上你缺乏语言经验,这可能需要一段时间才能解决。

相关内容

  • 没有找到相关文章

最新更新