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