2017-12-06 22 views
0

そのビューモデルに関連付けられたページに移動する前に、別のビューモデルから値をビューモデルに渡そうとしています。 私は以前にそれをビューに渡してから、ビューモデルに渡していました。これは物事をやっている不器用な方法のようです。 私はフレームワークを使用していないのでオプションではありません。 現時点では、プロパティは静的に設定されていますが、これは機能しますが、これが良い方法であるかどうかはわかりません。 コード:別のViewModelからViewModelのプロパティを設定する

ビューモデル1:

このコマンドは、新しいページを開きます。

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

ビューモデル2:(RouteStopPopOverViewModel)

public static string RouteName { get; set; } 

これが作業を行いますが、私は考えこれを達成するための方法として静的を使用しないことをお勧めします。 staticを使用せずに、またはview-> viewモデルを通して渡すことなく、RouteNameプロパティを設定する方法はありますか? 私はこれについていくつかの回答を見ましたが、質問にはっきりと答えないようです。ここ

答えて

1

あなたがそれらの両方の親にそれを表現できる階層がある場合は、ナビゲーション

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

ビューからビューモデルにパラメータを渡したくありませんでした。これはほとんど私の選択ではないので、私の手は結ばれています。これはまた、これを行うには不器用な方法のように思えます。 – user3355961

+0

あなたが知っている別の方法がありますか? – user3355961

+0

2クラス間でデータを転送してここに適用する方法について考えてください –

0

で簡単にあなたの条件を達成することができますサンプル。

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

乾杯、私はこれを見ていきます – user3355961

0

ビューモデル間でコントローラクラスを共有します。
両方のビューモデルで同じインスタンスをコンストラクタに渡す必要があります。
値を設定して、両方のビューモデルでイベントをリスンすることができます。
コントローラークラスが仲介役になります。

public class SharedController : IControlSomething 
{ 
    private string _sharedValue; 

    public string SharedValue 
    { 
     get => _sharedValue; 
     set 
     { 
      if (_sharedValue == value) 
       return; 

      _sharedValue = value; 
      OnSharedValueUpdated(); 
     } 
    } 

    public event EventHandler SharedValueUpdated; 

    protected virtual void OnSharedValueUpdated() 
    { 
     SharedValueUpdated?.Invoke(this, EventArgs.Empty); 
    } 
} 

public class ViewModel1 
{ 
    private readonly IControlSomething _controller; 

    public ViewModel1(IControlSomething controller) 
    { 
     // Save to access controller values in commands 
     _controller = controller; 
     _controller.SharedValueUpdated += (sender, args) => 
     { 
      // Handle value update event 
     }; 
    } 
} 

public class ViewModel2 
{ 
    private readonly IControlSomething _controller; 

    public ViewModel2(IControlSomething controller) 
    { 
     // Save to access controller values in commands 
     _controller = controller; 
     _controller.SharedValueUpdated += (sender, args) => 
     { 
      // Handle value update event 
     }; 
    } 
} 
0

あなたはMVVMパターンを使用しているとして、あなたはこれを達成するために、多くのMVVMフレームワークの1つを使用することができます。

次にSecondPageModelで私が最もMVVMものの

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 Initメソッドのパラメータにアクセスする見ることができる私はFreshMvvmを使用して、それは私がこの

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

ようなビューモデルの間でパラメータを渡すことができますフレームワークにも同様の機能があります。

関連する問題