C#的属性变更事件。父子互动

时间:2015-05-06 16:20:26

标签: c# event-handling inotifypropertychanged

我有一个存储任务列表的类Step:

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;

    }

每当个人更新任务时,我想提出一个事件。这个事件应该被父母抓住,即步骤..步骤应该检查所有任务的状态。

如果所有任务都是&#39; status为New,则Step status应自动设置为New。 如果所有任务都是&#39;状态已完成,然后步骤状态应自动设置为已完成。 如果任务的状态为“正在进行”,则“步骤状态”应设置为“进行中”。  我会称这种方法为TripleLogic,比如说。

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

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

1 个答案:

答案 0 :(得分:1)

第一个建议是不要在QString::number类上公开您的Tasks属性,以便消费者无论何时何时都无法修改集合。而是将Step方法添加到AddTask(Task t),然后在那里设置事件处理。

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

示例:

TaskStatus

返回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()的{​​{1}}事件,并跟踪Task中的任务数量。在StatusChanged事件的处理程序中,您可以获取任务的新状态,并在Step方法中执行您需要的任何逻辑。

示例:

StatusChanged

鉴于您已经提到过您是C#的新手,可能需要通过MSDN guide查看事件,特别是subscribingpublishing上的部分。发布部分提到了通用的TripleLogic()代表,我强烈建议使用该方法。

你的问题很模糊,而且很大,如果再加上你缺乏语言经验,这可能需要一段时间才能完成。