2017-12-06 1 views
0

Ich versuche, einen Wert an ein Ansichtsmodell aus einem anderen Ansichtsmodell zu übergeben, bevor ich zu der Seite navigiere, die diesem Ansichtsmodell angefügt ist. Ich habe es zuvor an die Ansicht übergeben und dann an das Ansichtsmodell übergeben. Dies scheint eine ungeschickte Art, Dinge zu tun. Ich benutze keine Art von Framework, so dass dies keine Option ist. Im Moment ist die Eigenschaft als statisch eingestellt und das funktioniert, aber ich bin mir nicht sicher, ob dies eine gute Praxis ist. Der Code:Festlegen einer Eigenschaft in einem ViewModel von einem anderen ViewModel

Ansicht Modell 1:

Dieser Befehl öffnet die neue Seite:

public void OpenRouteDetails() 
{ 
    RouteStopPopOverViewModel.RouteName = "TestRoute"; 
    App.Page.Navigation.PushAsync(new RouteStopPopOverView());    
} 

Ansicht Modell 2: (RouteStopPopOverViewModel)

public static string RouteName { get; set; } 

Dies funktioniert, aber ich würde bevorzugen Sie nicht, statische zu verwenden, um dies zu erreichen. Gibt es eine Möglichkeit, die RouteName-Eigenschaft festzulegen, ohne statisch zu verwenden oder sie durch Ansichts-> Ansichtsmodell zu übergeben. Ich habe einige Antworten dazu gesehen, aber sie scheinen die Frage nicht klar zu beantworten.

Antwort

1

hier die Probe Sie können Ihre Anforderung leicht mit Navigation

public class ViewModelFrom : BaseViewModel 
{ 
    async Task ExecuteCommand() 
    { 
     string routeName="value to trasfer"; 
     Navigation.PushAsync(new View(routeName)); 
    } 
} 


public partial class View : ContentPage 
{ 
    public View(string routeName) 
    { 
     InitializeComponent(); 
     BindingContext = new ViewModelTo(routeName); 
    } 
} 

public class ViewModelTo : BaseViewModel 
{ 
    public string RouteName { get; set; } 

    public ViewModelTo(string routeName) 
    { 
     RouteName=routeName; 
    } 
} 
+0

Ich wollte Parameter nicht über die Ansicht dann an das Ansichtsmodell übergeben. Das ist meistens nicht meine Entscheidung, also sind meine Hände gebunden. Dies scheint auch eine ungeschickte Möglichkeit, dies zu tun. – user3355961

+0

Gibt es einen anderen Weg, den du kennst? – user3355961

+0

darüber nachdenken, wie Sie Daten zwischen 2 Klassen übertragen und es hier anwenden –

0

Wenn es eine Hierarchie erreichen Sie, dass in einem Elternteil beide ausdrücken konnte.

public class Route 
{ 
    private string Name; 
} 

public class RouteSelectedArgs : EventArgs 
{ 
    public Route Selected { get; set; } 
} 

public interface IRouteSelection 
{ 
    event EventHandler<RouteSelectedArgs> RouteSelected; 
} 

public interface IRouteDetails { } 

public class RouteWizard 
{ 
    public UserControl view { get; set; } 

    private IRouteSelection _selection; 
    private IRouteDetails _details; 

    public RouteWizard(IRouteSelection selection, IRouteDetails details) 
    { 
     _selection = selection; 
     _details = details; 
     _selection.RouteSelected += Selection_RouteSelected; 
     view = MakeView(_selection); 
    } 

    private void Selection_RouteSelected(object sender, RouteSelectedArgs e) 
    { 
     _selection.RouteSelected -= Selection_RouteSelected; 
     view = MakeView(_details, e.Selected); 

    } 

    private UserControl MakeView(params object[] args) 
    { 
     ////magic 
     throw new NotImplementedException(); 
    } 
} 
+0

Prost, werde ich einen Blick darauf werfen – user3355961

0

Teilen Sie eine Controller-Klasse zwischen Ansichtsmodellen.
Die gleiche Instanz muss dem Konstruktor in beiden Ansichtsmodellen bereitgestellt werden.
So können Sie Werte festlegen und auf Ereignisse in beiden Ansichtsmodellen warten.
Die Controller-Klasse wird zum Intermediär.

0

Da Sie das MVVM-Muster verwenden, können Sie eines der vielen MVVM-Frameworks verwenden, um dies zu erreichen.

Ich benutze FreshMvvm und es mir erlauben, wie diese dann in SecondPageModel

await CoreMethods.PushPageModel<SecondPageModel>(myParameter, false); 

Parameter zwischen Ansicht Modelle passiere ich die Parameter in der Methode Init zugreifen sehen

private MyParamType _myParameter; 

public override void Init(object initData) 
{ 
    base.Init(initData); 

    var param = initData as MyParamType; 
    if (param != null) 
    { 
     _myParameter = param; 
    } 
} 

You can find more details about FreshMvvm here obwohl die meisten MVVM Frameworks haben ähnliche Funktionen.

Verwandte Themen