2017-06-28 2 views
1

Ich habe vier Ansicht Modelle M1, M2, M3, M4, von wo ich eine Nachricht an ein anderes Ansichtsmodell M5 senden. M5 führt dieselbe Aktion aus, wenn es eine Nachricht von einem von ihnen empfängt. Derzeit habe ich Code in M5 wie folgt geschrieben:Xamarin: Abonnieren mehrere Nachrichten mit der gleichen Aktion

MessgingCenter.Subscribe<M1, string>(this, "abc",() => { DoSomething(); }); 
MessagingCenter.Subscribe<M2, string>(this, "abc",() => { DoSomething(); }); 
MessgingCenter.Subscribe<M3, string>(this, "abc",() => { DoSomething(); }); 
MessagingCenter.Subscribe<M4, string>(this, "abc",() => { DoSomething(); }); 

Kann ich dies in einer Zeile erreichen?

Antwort

1

hugo ‚s Methode ist bevorzugt aber wenn nichts anderes passt, können Sie den Teilnehmer auch einfach zu einem string machen. Sie müssen nur auf diese Weise vorsichtig sein, da es für mehrere Abonnenten einfach ist, vom selben Send ausgelöst zu werden. Dann

MessagingCenter.Subscribe<string>(this , "abc", somethingString => { DoSomething(somethingString); }); 

...

MessagingCenter.Send("something", "abc"); 

Edit: Schnittstelle Codebeispiel in Hugos Antwort erwähnt Hinzufügen:

public interface IDoSomething { } //Does not necessarily have to have anything in it 

public class ViewModelA : IDoSomething { } 

public class ViewModelB : IDoSomething { } 

MessagingCenter.Subscribe<IDoSomething, string>(this, "abc",() => { DoSomething(); }); //IDoSomething works the same as deriving from a base class in this instance 
+0

Ich akzeptierte diese Antwort, da dies besser mein Problem passt. Die Ansichtsmodelle, die ich habe, machen keinen starken Fall, um von demselben Elternteil geerbt zu werden. Aber ich habe ihn aufgewertet, und das würde den meisten Leuten passen. – Naman

+0

@CuriousNewbie Sie können auch, wie hugo vorschlägt, eine Schnittstelle erstellen, die von jedem ViewModel implementiert wird. Siehe Bearbeiten für ein Beispiel. – hvaughan3

1

Sie können M1 erben, M2, M3, M4 aus dem gleichen Mutteransichtsmodell (oder Schnittstelle) mit einem Namen wie "BaseViewModel" und dann schreiben:

MessagingCenter.Subscribe<BaseViewModel, string>(this, "abc",() => { DoSomething(); }); 
Verwandte Themen