Ho trascorso alcuni giorni a cercare di capire WPF e MVVM. Sta andando molto lentamente, soprattutto perché ho una mancanza di conoscenza in termini di eventi e cose. Qui Bellow cercherò di spiegare la mia comprensione di tutte queste cose:Delegati, Azioni, Eventi, espressione Lambda e MVVM
Metodo - Questo è semplice e non credo che ha bisogno di alcuna spiegazione. Ingrediente di base in qualsiasi programma.
delegato - il modo in cui lo vedo è il puntatore sul metodo. Posso pensare solo a poche applicazioni in cui vorrei usarlo su un metodo.
Azione - quella è ancora più complicata. Le informazioni che sono riuscito a trovare dicono che è un delegato che non restituisce valore ... quindi è solo un puntatore sul metodo void? Non vedo il punto di quello
Evento - questo non riesco affatto. Era stato spiegato con un delegato e non capivo come funziona e a cosa serve. Nota Stavo usando eventi che scrivevano applicazioni winforms ma era solo scegliendo l'evento desiderato dalla lista.
Gestore di eventi - ancora più chiaro.
Espressione lambda - anche un altro modo di utilizzare il metodo. Ancora una volta capisco che non restituisce nulla, posso passare qualche argomento in esso, ma ancora non è molto diverso dal metodo del vuoto. Ho visto alcune applicazioni come quando uso LINQ ma ancora non capisco come funziona.
Vorrei iniziare dicendo che comprendo il costrutto di base di MVVM, cosa sta facendo cosa e così via. Il problema che ho è che non capisco parte del codice, come funziona e quindi non posso scrivere nulla per conto mio. Userò alcuni tutorial come esempio così qui va:
S1: https://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030
Cosa mi aspetto da voi ragazzi è una guida o una spiegazione come posso affrontare e capire quelli pensa di renderli almeno un po 'meno spaventosi per me. Qui inserirò alcuni esempi che si spera possano mostrarti che tipo di problemi ho.
1) In primo luogo si viene da S1 dalla ben nota classe RelayCommand:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
So cosa è supponiamo di fare (nome parla da sé). Ma non capisco come funzioni questa cosa? Come sa quando realizzare qualcosa eseguibile e quando no. Quali sono esattamente quelli che aggiungono e rimuovono i "comandi"? Ho provato a leggerlo ma non è stato d'aiuto.
2) Un altro esempio modulo S1:
#region CloseCommand
/// <summary>
/// Returns the command that, when invoked, attempts
/// to remove this workspace from the user interface.
/// </summary>
public ICommand CloseCommand
{
get
{
if (_closeCommand == null)
_closeCommand = new RelayCommand(param => this.OnRequestClose());
return _closeCommand;
}
}
#endregion // CloseCommand
#region RequestClose [event]
/// <summary>
/// Raised when this workspace should be removed from the UI.
/// </summary>
public event EventHandler RequestClose;
void OnRequestClose()
{
EventHandler handler = this.RequestClose;
if (handler != null)
handler(this, EventArgs.Empty);
}
#endregion // RequestClose [event]
Anche in questo caso so che cosa è supponiamo di fare, ho anche capito che cosa sta succedendo qui, ma in fondo non vedo dove questa “cosa” è in realtà fare qualcosa. OnRequestClose() sta creando un gestore che ai miei occhi non fa nulla per chiudere qualunque cosa si supponga di chiudere. Il problema è che se non vedo nemmeno dove viene eseguito il comando, come posso scrivere i miei comandi.
3) Penso che questa sarà l'ultima ad esempio, questa volta da S2:
public ViewModel()
{
_clickCommand = new DelegateCommand<string>(
(s) => { /* perform some action */ }, //Execute
(s) => { return !string.IsNullOrEmpty(_input); } //CanExecute
);
}
Qui problema è abbastanza semplice. Sta creando un comando usando RelayCommand ctor (o almeno la sua versione in questo progetto, qui chiamata "DelegateCommand"). Non capisco quelli (s) e l'uso di lambda. Cosa serve?
Ovviamente non è tutto quello che ho problemi, ma penso che darà un'idea di quale sia il mio problema per chiunque sia disposto ad aiutare. Ho cercato di spiegare il mio problema nel miglior modo possibile e apprezzerei davvero qualsiasi aiuto o guida. Forse mi aspetto molto da me stesso ma sento che ho bisogno di sapere tutte quelle cose per scrivere qualcosa di serio.
In ogni caso grazie a tutti in anticipo per qualsiasi aiuto.
Hai fatto un ottimo lavoro nel mettere insieme un sacco di materiale eccezionale per supportare ciò che penso sia probabilmente il migliore tra le tante domande. Quello che hai finito per chiedere è troppo ampio - una risposta qui sarebbe epicamente lunga. Dovresti interrompere questa domanda in parti più piccole e chiedere loro separatamente, ma sospetto che ogni parte sia stata chiesta e risposta. Probabilmente hai bisogno di scrivere una domanda relativa a ciascuna parte, con un codice che hai scritto per testare la tua comprensione e facci sapere dove sei rimasto bloccato. Quindi è probabile che tu abbia delle buone risposte. – Enigmativity
Per la cronaca, la tua comprensione di Lambda Expressions è sbagliata. Un lambda non restituisce necessariamente "void" o prende alcun argomento specifico. Considera la seguente espressione lambda valida: '() =>" Hello! "' Che non accetta parametri e restituisce 'string'. –
@Enigmativity Avevo paura che la domanda potesse essere troppo ampia, ma ho sentito che la maggior parte di queste cose sono collegate tra loro, quindi ho deciso di metterlo in questo grande argomento. Quando apprendo queste cose c'è un problema che capisco semplicemente x => x * x ma quando si tratta di cose serie diventa più complicato. Aspetterò un po 'per alcune risposte aggiuntive e se non compare nulla userò il tuo consiglio e cercherò di separarlo. Grazie per la risposta e i suggerimenti. – Bielik