2017-05-22 2 views
0

Ich verwende diese Technik für die Navigation zwischen den Ansichten: https://social.technet.microsoft.com/wiki/contents/articles/30898.simple-navigation-technique-in-wpf-using-mvvm.aspxZugriff auf Ansichtsmodell Eigenschaften in Mutteransichtsmodell

Ich habe das Hauptansichtsmodell mit Menütasten gebunden SelectedViewModel Eigenschaftsänderung Befehle:

class MainViewModel : INotifyPropertyChanged 
{ 
    public ICommand SomeViewCommand { get; set; } 
    public ICommand OtherViewCommand { get; set; } 
    private object selectedViewModel; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public object SelectedViewModel 
    { 
     get { return selectedViewModel; } 
     set { selectedViewModel = value; OnPropertyChanged("SelectedViewModel"); } 
    } 

    public MainViewModel() 
    { 
     SomeViewCommand = new RelayCommand<object, object>(null, (object o) => OpenSomeView()); 
     OtherViewCommand = new RelayCommand<object, object>(null, (object o) => OpenOtherView()); 
    } 

    private void OpenSomeView() 
    { 
     SelectedViewModel = new SomeViewModel(); 
    } 

    private void OpenOtherView(object obj) 
    { 
     if(SelectedViewModel != null && SelectedViewModel.GetType() == typeof(SomeViewModel)) 
     { 
      SomeViewModel s = (SomeViewModel)SelectedViewModel; 

      // always 0 
      if (s.NumberOfChanges > 0) 
      { 
      MessageBox.Show("test", "Error"); 
      } 

      // SelectedViewModel = new OtherViewModel(); after confirmation dialog 
     } 
     else 
      SelectedViewModel = new OtherViewModel(); 
    } 

    private void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 

} 

Wenn ich m in SomeView möchte ich die Eigenschaft (Anzahl der Änderungen) überprüfen, bevor ich zu OtherView wechsle, und dem Benutzer einen Bestätigungsdialog anzeigen, um seine Aktion zu bestätigen. Ich brauche den aktuellen Wert, aber jede Eigenschaft scheint ihren Initialisierungswert zu haben. Warum?

Was wäre der sauberste Weg, dies zu tun? Ich weiß, es kann getan werden, indem man die Eigenschaft statisch macht, aber das scheint mir dreckig zu sein.

+0

Ich vermute, das 'CurrentViewModel' in' OpenOtherView' sollte 'SelectedViewModel' sein? Sind Sie sich auch sicher, dass 'NumberOfChanges' sich tatsächlich in' SomeViewModel' ändert? – Mats391

+0

Es ist tatsächlich, ich habe den Code gekürzt, so dass er nur anzeigt, was gebraucht wird und dieses aus irgendeinem Grund umbenannt, korrigiert. Und ja, ich bin mir sicher, innerhalb des Child ViewModels ist der Wert korrekt. – Destroy666

+0

Der von Ihnen gepostete Code sollte von dem funktionieren, was ich sagen kann, daher vermute ich, dass das Problem innerhalb des untergeordneten ViewModel liegt. Wenn Sie nur die Anzahl der Änderungen benötigen, sollte das Zählen derjenigen im übergeordneten ViewModel über das 'PropertyChanged'-Ereignis des Kindes, wie es Satish vorschlägt, ebenfalls funktionieren. – Mats391

Antwort

0

In der OnPropertyChanged-Methode können Sie NumberOfChanges festlegen.

+0

Ich bin mir nicht sicher, ob ich Sie richtig verstehe, könnten Sie ein kurzes Beispiel zeigen? Privat – Destroy666

+0

'Leere OnPropertyChanged (string propName) { if (Property! = null) { \t s.NumberOfChanges ++; PropertyChanged (dies, neues PropertyChangedEventArgs (propName)); } } ' Etwas wie oben. Weil auf der Änderung jeder Eigenschaft diese Methode eintreten wird. Sie können dort erhöhen. Korrigiere mich, wenn ich falsch liege –

Verwandte Themen