Delegaty to coś boskiego :D Idealnie rozwiazały moj problem, oto jak go rozwiazalem :P
Moja solucja wykorzystuje wzorzec MvP, ale dodałem do niej projekt o nazwie ConDel (Controla Delegatów) do którego wszystkie częsci solucji oprócz widoku maja referencje.
namespace ConDel
{
public delegate void Wiadomosc(string msg);
public class Controller
{
private Wiadomosc _wiadomosc;
public void Add(Wiadomosc wiadomosc)
{
_wiadomosc += wiadomosc;
}
public void Wywolaj(string msg)
{
_wiadomosc(msg);
}
}
}
nastepnie w prezenterze utworzyłem obiekt klasy Controller _controller; i w konstruktorze prezentera dodałem do delegata metode updatujaca "Konsole widoku", a nastepnie przesłałem delegata dalej do modelu jako parametr metody zczytujacej delegata. (z jakiegos powodu nie mogłem dac delegata jako parametr w konstruktorze modelu, wywalalo mi bład zwiazany cos z referencja)
namespace Prezenter
{
public class CPrezenter
{
private CModel _data;
private IWidok _view;
private Controller controller;
public CPrezenter(IWidok view) : this(view, new CModel())
{}
public CPrezenter(IWidok view, CModel data)
{
_view = view;
_data = data;
controller = new Controller();
controller.Add(UpdateKonsole);
_data.GetDelegate(controller);
}
public void UpdateKonsole(string msg)
{
_view.Message = msg;
}
}
}
Model tworzy obiekt osoba i przesyła controller dalej jako parametr konstruktora Osoba
namespace Model
{
public class CModel
{
private Osoba osoba;
private Controller _controller;
public void GetDelegate(Controller controller)
{
_controller = controller;
osoba = new Osoba(_controller);
osoba.ZmienImie("Krzys");
}
}
}
Nastepnie obiekt klasy Osoba może w dowolnym momencie działania dowolnych algorytmów wywoływać metode aktualizowania konsoli która znajduje się w prezenterze, a konsola w widoku, to samo tyczy sie objektu klasy Model a także wszystkich innych obiektów które otrzymaja obiekt controller.
namespace Model
{
class Osoba
{
private Controller _controller;
private string imie;
private string nazwisko;
private int wiek;
public Osoba(Controller controller)
{
_controller = controller;
}
public void ZmienImie(string zimie)
{
imie = zimie;
_controller.Wywolaj("imie zostało zmienione na " + imie);
imie = "karolek";
_controller.Wywolaj("imie zostało zmienione na " + imie);
}
}
}
Moj "Widok" poniżej
namespace Widok
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, IWidok
{
CPrezenter prezenter;
public MainWindow()
{
InitializeComponent();
prezenter = new CPrezenter(this);
}
string IWidok.Message
{
get
{
return _tbkonsola.Text;
}
set
{
_tbkonsola.Text += value + Environment.NewLine;
}
}
}
}
Wybaczcie, że tak wszystko wypisuje ale gdy tłumacze to lepiej mi to do głowy wchodzi i może sie to przyda komuś innemu jeszcze :P Albo przynajmniej zostane solidnie skrytykowany za łamanie zasad programowania obiektowego i poprawie swoje błedy xD