Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [Visual Studio]Interfaccia grafica elaborata
Forum - C# / VB.NET - [Visual Studio]Interfaccia grafica elaborata - Pagina 4

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 11:47
Venerdì, 10/05/2013
Sei sempre molto dettagliato Dedalux ^^ grazie.
Allora l'uso di DI non mi sembra necessario nel caso di una listview, o no?
Command per un po lo lascio ancora da parte, quello che posso ancora fare alla vecchia scuola preferisco farlo cosi almeno adesso che sono ancora agli inizi con il WPF...
Pero voglio ancora fare qualche domanda riguardante i fatidici checkbox e la loro gestione attraverso il viewmodel:
Teoria: Ho due check per riga, se il check "lock" è true allora deve esserlo anche il check "check"
Ipotesi: allora pensavo ad una cosa del genere per quanto riguarda la gestione di check
Codice sorgente - presumibilmente VB.NET

  1. public bool check
  2.         {
  3.             get
  4.             {
  5.                 return this.check;
  6.             }
  7.             set
  8.             {
  9.                 if (value == false && this.locked == true) this.check = true; else this.check = value;
  10.                 RaisePropertyChanged("check");
  11.             }
  12.         }


direttamente nel view model, ma... non da i risultati sperati... cosa ancora non ho capito dei viewmodel che mi porta a questo fallimento?

PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 21:04
Venerdì, 10/05/2013
Codice sorgente - presumibilmente Plain Text

  1. Allora l'uso di DI non mi sembra necessario nel caso di una listview, o no?



Non si parla di usarla per la ListView, ma per la Window: il DataContext di solito non si imposta sul controllo, ma sull'intera View, perchè di solito quello che c'è in una View, nel tuo caso una Window, è tutto relativo allo stesso ViewModel, quindi sei hai anche dei command nel ViewModel che devono essere assegnati a dei Buttons, metti il VM come DataContext della finestra, e tutti i controlli figli, a meno che non venga loro assegnato un altro DC, ereditano quello del controllo superiore.

Quindi nel tuo caso, in cui potresti aver bisogno di un pulsante add/edit/..., con la DI faresti

Codice sorgente - presumibilmente C# / VB.NET

  1. var view = new MyView(new MyViewModel);



invece di

Codice sorgente - presumibilmente C# / VB.NET

  1. var view = new MyView();
  2. view.DataContext = new MyViewModel();



Altrimenti, se assegnassi il DC ad ogni singolo controllo, nel costruttore della Window ti toccherebbe fare

Codice sorgente - presumibilmente Plain Text

  1. InitializeComponent();
  2. this.listView.DataContext = myViewModel;
  3. this.AddButton.DataContext = myViewModel;
  4. this.DeleteButton.DataContext = myViewModel;
  5. //ecc...



E ogni volta che aggiungi o togli un controllo andare a modificare.

Per ora fai come ti trovi meglio, poi è probabile che quando ci prendi la mano tua senta la necessità di passare ad un container.

Comunque, da quello che ho capito, correggimi se sbaglio, hai una proprietà check di cui cambi il valore, e una lock chiamiamola "readonly" il cui valore dipende da check?

Io farei una sola get per lock che ritorna il valore di check (o il valore opposto), e nel set di check notificherei che anche lock è cambiata.

Ultima modifica effettuata da Dedalux il 10/05/2013 alle 21:16
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:06
Sabato, 18/05/2013
Non so perche ma non mi è arrivata la notifica della risposta... quindi scusa per il ritardo...
Ok ok ho capito, credevo servisse una view per ogni singolo controllo...
Ok quindi cerchero di usare la DI sembra molto piu elegante in effetti :-)
Allora spiego come pensavo l'impostazione:
Ho il listview con le prime due colonne checkbox "check" e "locked" solo che devono essere collegate tra loro da una relazione [Se porto a false "check" ma "locked" è true check dovrebbe tornare in automatico a true] in poche parole locked blocca il check su true, credo sia piu semplice da capire che da spiegare XD queste operazioni le faccio dal view principale, no?

PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 16:14
Sabato, 18/05/2013
Da quanto capisco riguardano i dati, quindi andrebbero fatte nel Model o nel ViewModel.
Cioè, se sono proprietà proprio del Model, allora dovrebbe gestirle lui. Però c'è anche da dire che c'è chi sostiene che il Model debba solo trasportare i dati, e quindi gestire la cosa nel VM.
Se potessi farmi capire meglio cosa sono check e locked e a cosa servono posso risponderti meglio.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:32
Sabato, 18/05/2013
Do un po per scontato le cose perche ho postato il sorgente del progetto, ma giustamente mi spiego meglio...
Ho una list view che contiene un elenco di file estrapolato da diverse directory... Questi file dovranno essere masterizzati su un disco in maniera automatica e casuale, quindi do la possibilità all'utente con il checkbox check di gestire quali file devono essere considerati per la masterizzazione
es sono selezionati 3 file su 10  e ne possono essere masterizzati due, quindi il programma eseguira una scelta causale di 2 file da questi 3 scelti dall'utente. Fino qui dovrebbe essere abbastanza semplice da capire... Il secondo checkbox servira nel caso l'utente voglia forzare la selezione di particolari file, quindi per logica se il checkbox locked è selezionato il checkbox check dello stesso file dovra essere selezionato pure lui. Quindi come potrai capire ho bisogno di controllare le azioni dell'utente su questi checkbox per poterli manipolare con coerenza. capito?

PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 19:52
Domenica, 19/05/2013
Allora farei gestire la cosa al Model.
Qualcosa di questo tipo
Codice sorgente - presumibilmente VB.NET

  1. private bool check;
  2. public boll Check
  3. {
  4.         get
  5.         {
  6.                 return this.check;
  7.         }
  8.         set
  9.         {
  10.                 if (this.check != value)
  11.                 {
  12.                         this.check = value;
  13.                         this.RaisePropertyChanged(() => this.Check);
  14.                 }
  15.         }
  16. }
  17.  
  18. private bool locked;
  19. public boll Locked
  20. {
  21.         get
  22.         {
  23.                 return this.locked;
  24.         }
  25.         set
  26.         {
  27.                 if (this.locked != value)
  28.                 {
  29.                         this.locked = value;
  30.                         this.RaisePropertyChanged(() => this.Locked);
  31.                         this.Checked = value; /* lo imposto sulla proprietà, non sulla variabile, così verrà chiamato il set completo di this.Checked con relativo RaisePropertyCHanged */
  32.                 }
  33.         }
  34. }


Ultima modifica effettuata da Dedalux il 19/05/2013 alle 19:52
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 20:31
Giovedì, 23/05/2013
Sono ancora piu confuso >.< boll? è un errore? credo di si, un altro dubbio che mi salta su, ma si puo definire una propietà due volte? una privata e una pubblica? non credo, o sbaglio? e un ultimissima cosa, il model non contiene il metodo RaisePropertyChanged(), mi avete detto che il model non eredita nessuna classe

PM Quote
Avatar
Dedalux (Member)
Pro


Messaggi: 103
Iscritto: 15/12/2010

Segnala al moderatore
Postato alle 17:09
Venerdì, 24/05/2013
Si, chiedo venia, "boll" è un errore, chiaramente intendevo "bool".

Non sono due proprietà: quella definita private è una variabile d'istanza, mentre quella con get-set è la proprietà, che per conservare il valore si appoggia alla variabile.

Il metodo RaisePropertyChanged è ereditato dalla classe ObservableObject (o affini) che implementano INotifyPropertyChanged.
Se n'era parlato, dicendo che non è obbligatoria per i Models, ma è molto utile.

A conti fatti, il meccanismo che ti propongo non fa altro che ritornare il valore di una proprietà attingendo dall'altra. E quando cambia una avvisare che potrebbe essere cambiata anche l'altra, tramite INotifyPropertyChanged. Se non ti interessa ti basta ignorare quel codice.

PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo