Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Notify a ViewmOdel property from another ViewModel

Îåêßíçóå áðü ôï ìÝëïò StrouMfios. Τελευταία δημοσίευση από το μέλος StrouMfios στις 12-02-2011, 21:22. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-02-2011, 10:54 63229

    Notify a ViewmOdel property from another ViewModel

    Καλημέρα σε όλους,

    προσπαθώ να καταλάβω με ποια λογική μπορεί ένα property απο ενα viewModel να πάρει τιμή απο ένα άλλο viewModel.

    Πιο συγκεκριμένα:

    έχω ενα application το οποίο έχει δύο  windows (χρησιμοποιούν διαφορετικά viewModels), το mainWIndow και ακόμα ένα (ας το πούμε popWindow) το οποίο ανοίγει με το πάτημα ενός κουμπιού.

    Αυτο που θέλω είναι:
    •  όταν ο χρήστης ανοίξει το popWindow να επιλέξει ένα item απο μια λίστα. Αυτό το item notifies ένα property στο viewModel του
    • Απο το viewModel του popWindow θέλω να περάσω το ίδιο Property στο viewModel του mainWindow. Το mainWIndow πρέπει να εμφανίσει την τιμή του property στο UI.
    προσπάθησα να κάνω το εξής:
    Έφτιαξα μια μέθοδο  στο viewModel του popWindow με όνομα OnSelectedItemChanged, η οποία ενημερώνει το viewModel του mainWindow.
    Δεν έπαιξε :(
     private Hotel _selectedHotel { get; set; }
            public Hotel SelectedHotel {
                get { return _selectedHotel; }
                set {
                    _selectedHotel = value;
                    RaisePropertyChanged("SelectedHotel");
                    OnSelectedItemChanged();
                }
            }
    
     void OnSelectedItemChanged() {
                MainWIndowViewModel = new MainWIndowViewModel(this.SelectedHotel);
            }

    Ποια είναι η λογική για να γίνει κάτι τέτοιο.
    Εκτός απο την λογική θα εκτιμούσα αν κάποιος μπορούσε να δείξει ενδεικτικά και κάποιο κομμάτι κώδικα.
    Ευχαριστώ


    αν δεν το θες, www.antallakseto.gr
    Δημοσίευση στην κατηγορία: ,
  •  12-02-2011, 11:23 63230 σε απάντηση της 63229

    Απ: Notify a ViewmOdel property from another ViewModel

    Στο OnSelectedItemChanged φτιάχνεις ένα νέο MainWindowViewModel και του περνάς μια τιμή. Αυτό όμως το VM δεν είναι αυτό που χρησιμοποιείται από το View, είναι ένα άλλο, νέο. Θα πρέπει να βρεις το VM που έχει σηκώσει το MainWindowView. Κάτι τέτοιο μπορείς να το κάνεις εύκολα αν χρησιμοποιήσεις το ViewModel Locator pattern ωστόσο αυτό δεν είναι και τόσο καλή τακτική γιατί δημιουργεί dependencies μεταξύ των VMs. Η καλύτερη τακτική είναι ο μηχανισμός του messaging service (ή αλλιώς Mediator Pattern) μέσω του οποίου το PopUpViewModel θα κάνει broadcast ένα μήνυμα με το SelectedHotel και το MainWindowViewModel θα "ακούει" γι αυτό το μήνυμα και όταν το λάβει, θα κάνει ό,τι είναι να κάνει. Ψάξε λίγο το θέμα με το messaging, δούλεψε ένα μικρό demo και θα δεις τη λύση.


    Vir prudens non contra ventum mingit
  •  12-02-2011, 11:27 63231 σε απάντηση της 63230

    Απ: Notify a ViewmOdel property from another ViewModel

    Ωραία, θα το κοιτάξω.
    Μέχρι στιγμής δεν ήξερα καν τι έπρεπε να ψάξω. Τώρα όμως έχω κάποιο μπούσουλα.
    Σ'ευχαριστώ.

    αν δεν το θες, www.antallakseto.gr
  •  12-02-2011, 11:37 63232 σε απάντηση της 63230

    Απ: Notify a ViewmOdel property from another ViewModel

    KelMan:

    Στο OnSelectedItemChanged φτιάχνεις ένα νέο MainWindowViewModel και του περνάς μια τιμή. Αυτό όμως το VM δεν είναι αυτό που χρησιμοποιείται από το View, είναι ένα άλλο, νέο. Θα πρέπει να βρεις το VM που έχει σηκώσει το MainWindowView. Κάτι τέτοιο μπορείς να το κάνεις εύκολα αν χρησιμοποιήσεις το ViewModel Locator pattern ωστόσο αυτό δεν είναι και τόσο καλή τακτική γιατί δημιουργεί dependencies μεταξύ των VMs. Η καλύτερη τακτική είναι ο μηχανισμός του messaging service (ή αλλιώς Mediator Pattern) μέσω του οποίου το PopUpViewModel θα κάνει broadcast ένα μήνυμα με το SelectedHotel και το MainWindowViewModel θα "ακούει" γι αυτό το μήνυμα και όταν το λάβει, θα κάνει ό,τι είναι να κάνει. Ψάξε λίγο το θέμα με το messaging, δούλεψε ένα μικρό demo και θα δεις τη λύση.


    Αυτό έχει σχέση με αυτό που μου είπες?
    void ShowHotelWindowExecute() {
                Messenger.Default.Send(new NotificationMessage("ShowHotelWindow"));
            }
    
    if (msg.Notification == "ShowHotelWindow") {
                    var hotelAddSelect = new Hotel_Add_Select();
                    hotelAddSelect.Show();
                }
    Ευχαριστώ

    αν δεν το θες, www.antallakseto.gr
  •  12-02-2011, 11:54 63233 σε απάντηση της 63232

    Απ: Notify a ViewmOdel property from another ViewModel

    StrouMfios:
    KelMan:

    Στο OnSelectedItemChanged φτιάχνεις ένα νέο MainWindowViewModel και του περνάς μια τιμή. Αυτό όμως το VM δεν είναι αυτό που χρησιμοποιείται από το View, είναι ένα άλλο, νέο. Θα πρέπει να βρεις το VM που έχει σηκώσει το MainWindowView. Κάτι τέτοιο μπορείς να το κάνεις εύκολα αν χρησιμοποιήσεις το ViewModel Locator pattern ωστόσο αυτό δεν είναι και τόσο καλή τακτική γιατί δημιουργεί dependencies μεταξύ των VMs. Η καλύτερη τακτική είναι ο μηχανισμός του messaging service (ή αλλιώς Mediator Pattern) μέσω του οποίου το PopUpViewModel θα κάνει broadcast ένα μήνυμα με το SelectedHotel και το MainWindowViewModel θα "ακούει" γι αυτό το μήνυμα και όταν το λάβει, θα κάνει ό,τι είναι να κάνει. Ψάξε λίγο το θέμα με το messaging, δούλεψε ένα μικρό demo και θα δεις τη λύση.


    Αυτό έχει σχέση με αυτό που μου είπες?
    void ShowHotelWindowExecute() {
                Messenger.Default.Send(new NotificationMessage("ShowHotelWindow"));
            }
    
    if (msg.Notification == "ShowHotelWindow") {
                    var hotelAddSelect = new Hotel_Add_Select();
                    hotelAddSelect.Show();
                }
    Ευχαριστώ

    Μάλλον έχει αλλά έχει ακριβώς με τις ίδιες μεθόδους του object Messenger.
    Θα το ψάξω κι άλλο

    αν δεν το θες, www.antallakseto.gr
  •  12-02-2011, 17:26 63235 σε απάντηση της 63233

    Απ: Notify a ViewmOdel property from another ViewModel

    Ναι, έχει σχέση, η κλάση messenger είναι μια υλοποίηση του Mediator pattern. Βέβαια, μπορείς αντί να περνάς string (που δεν σου παρέχει ασφάλεια μιας και αν κάνεις ένα τυπογραφικό θα το ανακαλύψεις στο runtime) να περνάς custom μηνύματα. Μπορεί το μήνυμα να περιέχει ολόκληρη την πληροφορία που σε ενδιαφέρει που στη συγκεκριμένη περίπτωση είναι το SelectedHotel.

     


    Vir prudens non contra ventum mingit
  •  12-02-2011, 21:22 63238 σε απάντηση της 63235

    Απ: Notify a ViewmOdel property from another ViewModel

    KelMan:

    Ναι, έχει σχέση, η κλάση messenger είναι μια υλοποίηση του Mediator pattern. Βέβαια, μπορείς αντί να περνάς string (που δεν σου παρέχει ασφάλεια μιας και αν κάνεις ένα τυπογραφικό θα το ανακαλύψεις στο runtime) να περνάς custom μηνύματα. Μπορεί το μήνυμα να περιέχει ολόκληρη την πληροφορία που σε ενδιαφέρει που στη συγκεκριμένη περίπτωση είναι το SelectedHotel.


    Ακολούθησα αυτά που μου είπες και δούλεψε :)  
    //MainWindow Constructor
       public MainWIndowViewModel(IDialogService dialog) {
                this._dialog = dialog;
                Messenger.Default.Register<NotificationMessage<Hotel>>(this, NotificationMessageReceived);
            }
    
            private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
                this.SelectedHotel = selectedHotel.Content;
            }
    
    //PopUpViewModel Property
    private Hotel _selectedHotel { get; set; }
            public Hotel SelectedHotel {
                get { return _selectedHotel; }
                set {
                    _selectedHotel = value;
                    RaisePropertyChanged("SelectedHotel");
                    Messenger.Default.Send(new NotificationMessage<Hotel>(this, SelectedHotel, "SelectedHotel"));
                }
            }
    Και πάλι σε ευχαριστώ πολύ!

    αν δεν το θες, www.antallakseto.gr
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems