Untitled

 avatar
unknown
plain_text
2 years ago
1.9 kB
2
Indexable
public class MainViewModel : ViewModelBase
{
    public ObservableCollection<Category> Categories { get; set; } = new ObservableCollection<Category>();

    public MainViewModel()
    {
        Categories.CollectionChanged += Categories_CollectionChanged;
    }

    private void Categories_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (Category category in e.NewItems)
            {
                category.Tasks.CollectionChanged += Tasks_CollectionChanged;
            }
        }
        else if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (Category category in e.OldItems)
            {
                category.Tasks.CollectionChanged -= Tasks_CollectionChanged;
            }
        }
    }

    private void Tasks_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove)
        {
            foreach (Task task in e.OldItems)
            {
                if (Categories.Any(c => c.Tasks.Contains(task)))
                {
                    continue;
                }

                if (string.IsNullOrWhiteSpace(task.Category))
                {
                    Categories[0].Tasks.Add(task);
                }
                else
                {
                    Categories.Add(new Category { Name = task.Category, Tasks = new ObservableCollection<Task> { task } });
                }
            }
        }
    }

    public void AddCategory(string name)
    {
        Categories.Add(new Category { Name = name });
    }

    public void AddTask(string title, string description, Category category)
    {
        category.Tasks.Add(new Task { Title = title, Description = description, Category = category.Name });
    }
}