2016-04-04 25 views
-1

Ich möchte ein Ereignis erstellen und abonnieren ist auf einem anderen ViewModel. Der Event-Handler erhält immer Null auf dem ersten ViewModel. Im ersten Ansichtsmodell erklärte ich Ereignis und hob alsEventHandler ist immer Null?

public event EventHandler EditSearchChanged; 

und aufgewachsen als

 if (EditSearchChanged != null) 
     { 
      EditSearchChanged(this, null); 
     } 

Im zweiten Ansichtsmodell folgt, habe ich eine Eigenschaft des ersten Ansichtsmodell erklärt.

private EditTileViewModel editTileVM; 

    public EditTileViewModel EditTileVM 
    { 
     get 
     { 
      return editTileVM ?? (editTileVM = new EditTileViewModel()); 
     } 
     set 
     { 
      editTileVM = value; 
      RaisePropertyChanged(); 
     } 
    } 

und das Ereignis abonniert wie folgt

EditTileVM.EditSearchChanged += EditTileVM_EditSearchChanged; 

    private void EditTileVM_EditSearchChanged(object sender, EventArgs e) 
    { 
     this.EditTileVM = (sender as EditTileViewModel); 
    } 

Debugger Ergebnis enter image description here

+0

Hier EditSearchChanged ist null – subminer

+0

Ist es möglich, dass die Zeile 'EditTileVM.EditSearchChanged + = EditTileVM_EditSearchChanged;' wird nie ausgeführt und deshalb nie gesetzt? Vielleicht etwas mehr Code liefern? – mnemonic

+1

können Sie einen Debugger bei 'EditTileVM.EditSearchChanged + = EditTileVM_EditSearchChanged' platzieren und prüfen, ob es ausgelöst wird? – Rohit

Antwort

0

kommt es vor, als Sie wieder eine neue Instanz von ViewModel in folgenden Eigenschaft erstellen:

private EditTileViewModel editTileVM; 
public EditTileViewModel EditTileVM 
{ 
    get 
    { 
     return editTileVM ?? (editTileVM = new EditTileViewModel()); 
    } 
    set 
    { 
     editTileVM = value; 
     RaisePropertyChanged(); 
    } 
} 

Also gibt es zwei Insta nces von EditViewModel.

Ich schlage vor, Sie EventAggregator pattern zwischen zwei viewModels von Prism-Framework zu verwenden:

// Subscribe 
eventAggregator.GetEvent<CloseAppliactionMessage>().Subscribe(ExitMethod); 

// Broadcast 
eventAggregator.GetEvent<CloseAppliactionMessage>().Publish(); 

Bitte, ein sehr gutes Tutorial von Rachel Lim sehen über simplified Event Aggregator pattern.

Oder verwenden MVVM Light messenger:

//Subscribe 
Messenger.Default.Register<CloseAppliactionMessage>(ExitMethod); 

// Broadcast 
Messenger.Default.Send<CloseAppliactionMessage 
+0

@subminer zögern Sie keine Frage zu stellen. Wenn Sie meinen, dass meine Antwort Ihnen hilft, dann können Sie meine Antwort als eine Antwort markieren, um die zukünftige Suche nach anderen Personen zu vereinfachen. Bitte lesen Sie diese http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp