Czy byłby ktoś na tyle miły i postarał się wytłumaczyć mi jak poprawnie powiązać Presenter z View? Załóżmy, że po kliknięciu na kontrolkę na formie chcę otworzyć okno dialogowe i pobrać ścieżkę do wybranego pliku. Jak coś takiego zaimplementować? Sporo googlowałem, ale ciężko o jakieś jednoznaczne informacje poparte przykładami. Jak na razie mam coś takiego:
View:
public partial class Form1 : Form, IView
{
private readonly IPresenter _presenter;
public Form1()
{
InitializeComponent();
_presenter=new PresenterMainForm(this);
}
private void openFileToolStripMenuItem_Click(object sender, EventArgs e)
{
_presenter.OpenFileDialog();
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
Presenter:
class PresenterMainForm : IPresenter
{
private const string OpenFileDialogTitle = "Open File";
private const string OpenFileDialogInitialDirecotry = @"C:\";
private const string OpeningFileErrorMessage = "Something went wrong when trying to open the chosen file";
private string _fileToBeOpen;
private IView _view;
public PresenterMainForm(IView view)
{
_view = view;
}
public void OpenFileDialog()
{
var openFileDialog = new OpenFileDialog();
openFileDialog.Title = OpenFileDialogTitle;
openFileDialog.InitialDirectory = OpenFileDialogInitialDirecotry;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_fileToBeOpen = openFileDialog.FileName;
Console.WriteLine(_fileToBeOpen);
}
catch(IOException)
{
MessageBox.Show(OpeningFileErrorMessage);
}
}
}
}
IPresenter:
interface IPresenter
{
void OpenFileDialog();
}
No ale to chyba bieda straszna, bo tu Presenter operuje na kontrolkach... Byłbym ogromnie wdzięczny za jakiś prosty przykład lub chociaż wypisanie w punktach jak to poprawnie zaimplementować.
EDIT: Czy może ten kod:
public void OpenFileDialog()
{
var openFileDialog = new OpenFileDialog();
openFileDialog.Title = OpenFileDialogTitle;
openFileDialog.InitialDirectory = OpenFileDialogInitialDirecotry;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
_fileToBeOpen = openFileDialog.FileName;
Console.WriteLine(_fileToBeOpen);
}
catch(IOException)
{
MessageBox.Show(OpeningFileErrorMessage);
}
}
wykonywać w jakiś sposób w View i tylko w jakiś sposób zwracać wartość do Presentera? Jeśli tak to jak? Jakimś seterem w Presenterze?