The general architecture should implement the Model-View-Controller (MVC) pattern (or Model-View-Presenter with a stronger decoupling of model and view) , and it looks, like you started with that already. You have classes, that represent 'the task' and 'the tasklist' and you have an UI to present the tasklist (the model) to the user. Now you need an interface (or a set of interfaces) for the model and the ui and you want to make sure, that the model does not know the ui and the ui does not know the model.
Because in between, you have the presenter class(es), that will react on model changes and ui events (Observer pattern, databinding as a technique). It can listen to the model and update the view. So you want to make your model observable. And it can listen to events from the view (value edits, actions) and pass this information to the model, so it can (try to) adapt to the user intended changes (the model and only the model will validate the user input and give a response to the presenter).
Yes, it is quite complex. To start off, break your application into the three parts (model, view, controller/presenter) and make the model observable. So you can start easily with a view that is automatically update when the model changes. And then, step by step, you could add functionality to react on user inputs on the UI.