Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Ahh scusate, quanta confusione che faccio XD ok ok, allora facciamo ereditare la classe del model, perfetto cosi mi si semplificano le cose :-) grazie
Okkkk funziona alla perfezione
Codice sorgente - presumibilmente C++ |
private bool Check; public bool check { get { return this.Check; } set { this.Check = value; if (this.check == false && this.locked == true) { this.locked = false; this.RaisePropertyChanged(() => this.locked); } this.RaisePropertyChanged(() => this.check); } } private bool Locked; public bool locked { get { return this.Locked; } set { this.Locked = value; if (this.check == false && this.Locked == true) { this.check = true; this.RaisePropertyChanged(() => this.check); } this.RaisePropertyChanged(() => this.locked); } }
|
Ora si che ho capito :-) ho fatto giusto un paio di modifiche e corretto gli errori, ora mi porterò a lavorare sui viewmodel e spero di non trovare ulteriori difficoltà xD ma giusto un ultima (ho il presentimento che questa sia una bugia bella e buona) ma il metodo RaisePropertyChanged perche accetta il parametro in questo modo cosi particolare ()=>this.locked? non credo puntassero a creare un allegra emoticon o sbaglio?
|
|
Dedalux (Member)
Pro
Messaggi: 103
Iscritto: 15/12/2010
|
Si potrebbe fare anche RaisePropertyChanged("NomeProprietà") usando una stringa, ma questa tecnica, che usa le cosiddette "magic strings", porta con se, insieme alla facile implementazione, il rischio di scrivere male il nome della proprietà, o di ritrovarsi con il codice che non funziona più dopo averlo cambiato.
Questa tecnica invece utilizza un'espressione lambda che contiene la proprietà vera e propria (nota che hai sbagliato e hai scritto "locked" con la minuscola, che è la variabile: non te lo segna errore ma non funzionerà).
Utilizzando la proprietà vera e propria, sei sicuro di scriverla giusta, e di esserti tutelato in caso di refactoring del nome.
Ultima modifica effettuata da Dedalux il 25/05/2013 alle 0:00 |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Postato originariamente da Dedalux:
(nota che hai sbagliato e hai scritto "locked" con la minuscola, che è la variabile: non te lo segna errore ma non funzionerà). |
Scusa, ma dove? perche lo script mi funziona a meraviglia, e fa quello che prima non riuscivo assolutamente a fare XD |
|
Dedalux (Member)
Pro
Messaggi: 103
Iscritto: 15/12/2010
|
A parte che non è uno script, ma è codice. Comunque nei RaisePropertyChanged che hai messo qua, nel tuo messagio, () => this.[proprietà], la proprietà l'hai messa con la minuscola, quindi accedi alla variabile e non alla proprietà vera e propria.
Poi se la proprietà (quella vera) l'hai messa in minuscolo, allora ok...
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Si scusa mementi del web. Comunque io seguo le regole di scrittura che impongono classi maiuscole, invece metodi e proprietà minuscole, per tanto mi ritrovo ItemsSource="{Binding itemsMusic}" o IsChecked="{Binding check}"... e anche questi dubbi sembrano essersi diradati...
Grazie mille mi avete aiutato tantissimo
Ora sto leggendo un po dei command
Codice sorgente - presumibilmente C++ |
public RelayCommand removePath { get { return new RelayCommand(removeButton_Click); } } private void removeButton_Click() { this.itemsPath.RemoveAt(this.selectedPath); if(this.itemsPath.Count != 0) this.selectedPath = 0; this.RaisePropertyChanged(() => this.selectedPath); this.updatePath(); }
|
con i click non trovo problemi, ma veramente non capisco perche non vi siano guide di facile accesso e complete...
Per esempio davanti ad un command cosi semplice non trovo problemi ma gia se cerco di bindare un evento particolare come il closing della window trovo diversi problemi, mi sapresti indirizzare?
|
|
Dedalux (Member)
Pro
Messaggi: 103
Iscritto: 15/12/2010
|
I commands stanno nel ViewModel. Quindi anche il metodo che scatenano deve risiedere li. Quindi se hai definito nel codebehind della View un button_click, non potrai usarlo nel ViewModel, perchè non si trova li.
Se invce ti trovi nel ViewModel, non andrei a chiamarlo in quel modo, perchè in fin dei conti è un metodo, e potrebbe essere chiamato da qualsiasi cosa, non solo da un button.
Riguardo l'ultima domanda:
[...] se cerco di bindare un evento particolare come [...] |
il Binding funziona solo con le proprietà (per questo sono nati i command, i metodi non sono bindabili).
Se hai una proprietà di tipo event, puoi bindarla ma devi avere un corrispettivo lato View che possa utilizzarla.
Se tu vuoi gestire l'evento close, non è il modo giusto di procedere.
Se quello che vuoi fare è abbinare ad un evento un command, si può fare. Cerca EventToCommand.
P.S. Non so che notazione stia utilizzando tu, ma da quel che so di solito si usa scrivere
NomeClasse
NomeProprietà
nomeVariabile
NOME_COSTANTE
invece ho visto che per proprietà e variabili fai il contrario |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Cerco di far gestire un evento dal viewmodel, e credevo che il command fosse l'unico metodo, ne esistono di piu efficaci?
Io adopero una scrittura che mi porto dietro dal PHP, non tengo tanto a compararla con altri metodi di scrittura, in quanto la logica che sta dietro ad essa è la stessa che sta dietro uno pseudo-codice
|
|
Dedalux (Member)
Pro
Messaggi: 103
Iscritto: 15/12/2010
|
Ultima modifica effettuata da Dedalux il 27/05/2013 alle 21:39 |
|