Общая архитектура должна реализовывать шаблон Model-View-Controller (MVC) (или Model-View-Presenter с более сильным разделением модели и вида), и, похоже, вы уже начали с этого. У вас есть классы, которые представляют «задачу» и «список задач», и у вас есть пользовательский интерфейс для представления списка задач (модели) пользователю. Теперь вам нужен интерфейс (или набор интерфейсов) для модели и пользовательского интерфейса, и вы хотите убедиться, что модель не знает пользовательский интерфейс и пользовательский интерфейс не знает модель.
Поскольку между ними у вас есть класс (ы) докладчика, который будет реагировать на изменения модели и события пользовательского интерфейса (шаблон наблюдателя, привязка данных в качестве метода). Он может слушать модель и обновлять вид. Итак, вы хотите, чтобы ваша модель наблюдалась. Кроме того, он может прослушивать события из представления (редактирование значений, действия) и передавать эту информацию в модель, чтобы он мог (попытаться) адаптировать изменения, предусмотренные пользователем (модель и только модель будут проверять вводимые пользователем данные и давать ответ докладчику).
Да, это довольно сложно. Для начала разбейте ваше приложение на три части (модель, представление, контроллер / презентатор) и сделайте модель наблюдаемой. Таким образом, вы можете легко начать с представления, которое автоматически обновляется при изменении модели. И затем, шаг за шагом, вы можете добавить функциональность для реагирования на пользовательский ввод в пользовательском интерфейсе.