Sto lavorando su un modello di vista per una vista che presenta una finestra di dialogo con le opzioni di esportazione. L'utente seleziona le opzioni quindi fa clic su Esporta. Quando il modello di visualizzazione completa l'esportazione, il modello di visualizzazione chiamante riceve la notifica.
Sono curioso quale sia la pratica migliore per implementare la notifica: un evento tradizionale o un callback Action
che viene passato quando viene aperta la finestra di dialogo.
Evento tradizionale
public class ExportDialogViewModel : ViewModelBase
{
private readonly ICommand _exportCommand;
private readonly ICommand _cancelCommand;
public event EventHandler Finished;
public ICommand ExportCommand
{
get { return _exportCommand; }
}
public ICommand CancelCommand
{
get { return _cancelCommand; }
}
public ExportDialogViewModel()
{
_exportCommand = new RelayCommand(Export);
_cancelCommand = new RelayCommand(Cancel);
}
public void Initialize()
{
//set the initial conditions
}
public void Export()
{
//perform export
OnFinished();
}
public void Cancel()
{
OnFinished();
}
private void OnFinished()
{
if (Finished != null) Finished(this, EventArgs.Empty);
}
}
Callback
public class ExportDialogViewModel2 : ViewModelBase
{
private readonly ICommand _exportCommand;
private readonly ICommand _cancelCommand;
private Action _callback;
public ICommand ExportCommand
{
get { return _exportCommand; }
}
public ICommand CancelCommand
{
get { return _cancelCommand; }
}
public ExportDialogViewModel2()
{
_exportCommand = new RelayCommand(Export);
_cancelCommand = new RelayCommand(Cancel);
}
public void Initialize(Action callback)
{
_callback = callback;
//set the initial conditions
}
public void Export()
{
//perform export
_callback();
}
public void Cancel()
{
_callback();
}
}
Il mio pensiero iniziale è che l'evento tradizionale è un po 'più flessibile: consente a più abbonati di essere avvisati e consente anche di avvisare zero abbonati. Il callback, d'altra parte, impone un particolare modo di interagire con la finestra di dialogo - il callback deve essere passato durante l'inizializzazione. Il callback è anche più semplice da implementare e utilizzare, anche se forse è meno familiare degli eventi.
Quale dei due modelli di notifica consigli e perché?