属性 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;
}
}
返回 Step
和 AddTask()
方法,订阅 Task
的 StatusChanged
事件并跟踪 [=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>
委托,我强烈建议使用该方法。
你的问题含糊不清,而且太大了,再加上你缺乏语言经验,这可能需要一段时间才能解决。
我有一个 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;
}
}
返回 Step
和 AddTask()
方法,订阅 Task
的 StatusChanged
事件并跟踪 [=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>
委托,我强烈建议使用该方法。
你的问题含糊不清,而且太大了,再加上你缺乏语言经验,这可能需要一段时间才能解决。