Καλησπέρα σε όλους,
όπως μου είχε προτείνει ο KelMan(τον ευχαριστώ πολύ) χρησιμοποιώ το mediator Pattern για επικοινωνία μεταξύ viewModel και view.
λοιπόν,
στο mainWindow έχω ενα menu όπου σε κάθε item του έχω ορίσει ενα command.
Όταν κάνω click σε ένα item στέλνω μήνυμα το οποίο το έχω κάνει register στο mainWindow.xaml.cs
//MainWindow.xaml
<awc:ImageButton IsToolStyle="True" Orientation="Vertical" ImageSource="" Command="{Binding ShowPricesWindowCommand}">Prices</awc:ImageButton>
//MainWIndow ViewModel
public ICommand ShowPricesWindowCommand {
get { return new RelayCommand(ShowPricesWindowExecute); }
}
void ShowPricesWindowExecute() {
Messenger.Default.Send(new NotificationMessage<Hotel>(this, SelectedHotel, "ShowPricesWindow"),
"ShowPricesWindow");
}
//MainWindow.xaml.cs
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow", HotelPriceMessageReceived);
private void HotelPriceMessageReceived(NotificationMessage<Hotel> selectedHotel) {
var roomPrices = new RoomPrices();//This view has the RoomPriceViewModel as dataContext
roomPrices.Show();
//via messaging I am sending the selectedHotel object
Messenger.Default.Send(new NotificationMessage<Hotel>(this, selectedHotel.Content, "ShowPricesWindow"),
"ShowPricesWindow2");
}
μου ανοίγει το ζητούμενο παράθυρο και μέσα απο το viewModel του(RoomPricesViewModel), κάνω κάποιον έλεγχο και κλείνω το view που είχε ανοίξει και ανοίγω ένα άλλο.
public RoomPricesViewModel(IDialogService dialogService) {
this._dialog = dialogService;
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow2", NotificationMessageReceived);
}
private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
this.SelectedHotel = selectedHotel.Content;
LoadRooms();
}
void LoadRooms() {
if (rooms.Count == 0) {
dialogResponse = _dialog.ShowMessage("Display a message;", "", DialogButton.YesNo, DialogImage.Warning);
switch (dialogResponse) {
case DialogResponse.Yes:
//close the RoomPrices window and open the RoomTypesWindow
Messenger.Default.Send(new NotificationMessage<Hotel>(this, this.SelectedHotel, "CloseWindowAndOpenRoomTypes"), "CloseWindowAndOpenRoomTypes");
return;
break;
case DialogResponse.No:
break;
}
}
}
public RoomPrices() {
InitializeComponent();
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "CloseWindowAndOpenRoomTypes", CloseWindowAndOpenRoomTypes);
}
private void CloseWindowAndOpenRoomTypes(NotificationMessage<Hotel> selectedHotel) {
if (selectedHotel.Sender == this.DataContext) {
this.Close();
Messenger.Default.Send(new NotificationMessage<Hotel>(this, selectedHotel.Content, "ShowRoomsWindow"),
"ShowRoomsWindow");
}
}
Αυτή η διαδικάσία λειτουργεί "σωστά" για μία φορά μόνο.
Αν κλείσω και το δεύτερο παράθυρο που έχει ανοίξει και ξαναπατήσω το item στο menu, τότε η όλη διαδικασία θα επαναληφθεί δύο φορές.
Το ίδιο συμβαίνει για όσες φορές και αν πατήσω το item.
Πρέπει τα messages να τα κλείνω με κάποιον τρόπο?
Ευχαριστώ
αν δεν το θες,
www.antallakseto.gr