2016-10-20 15 views
0

私はPRISMにはかなり新しく、毎日私はそれをもっと愛していると言わなければなりません!現時点では、(Dependency Injectionを介して)新しく作成されたビューにパラメータを渡す方法に問題があります。私の状況は以下の通りです。 ユーザーがボタンをクリックすると、画面の右側に新しいビューが作成されます。私はこれを次のようにしています:DIを介して新しい作成ビューにパラメータを渡す方法

IRegion地域= this._regionManager.Regions [RegionNames.ActionRegion];

object boxView = region.GetView("BoxDetailsView"); 
if (boxView == null) 
     { 
     boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>(); 
      region.Add(boxView, "BoxDetailsView"); 
     } 

     region.Activate(boxView); 

これはかなりうまく動作します。しかし、私はそのビューにパラメータを渡す必要があり、私は手がかりを持っていません。 OnNavigationFrom & OnNaviagationToは機能しません。私がMainViewからナビゲートしていないので、私は追加のビューを開いています。 私は非常に有名なStock Trader RIをチェックしましたが、それを達成する方法はまだ見つかりませんでした。

私は非常に近いと感じていますが、少しは間違っています。誰も助けることができますか?

おかげで、あまりにもプリズムの新しい

N.

答えて

1

ナビゲーションフレームワークの使用をお勧めします。 RequestNavigateを使い、メソッド呼び出しでパラメータを渡すだけです。次に、View/ViewModelにINavigationAwareを実装させて、渡したパラメータにアクセスできるようにします。

0

イム、私のプロジェクトで私は、子ビューへのviewmodelなどのパラメータを渡すためにRegionContextを使用。 XAMLで

地域(source)(私はビューを解決するためにUnityの使用):

<TabControl 
    regions:RegionManager.RegionName="{x:Static inf:RegionNames.ServerTabPartRegion}" 
    regions:RegionManager.RegionContext="{Binding CurrentServer, Mode=OneWay}"> 
    </TabControl> 

ビュー登録パラメータを取得する(source

public void Initialize() 
    { 
     _regionManager.RegisterViewWithRegion(RegionNames.ServerTabPartRegion, CreateView); 
    } 

    private object CreateView() 
    { 
     return ServerTabViewHelper.RegisterView<OnlinePlayers, ServerInfo, ServerMonitorPlayerViewModel>(_container, 
      "serverInfo"); 
    } 

ヘルパー(source

public static class ServerTabViewHelper 
{ 
    public static TView RegisterView<TView, TViewParameter, TViewModel>(IUnityContainer container, string parameterName) 
     where TView : FrameworkElement where TViewParameter : class 
    { 
     var view = container.Resolve<TView>(); 
     var context = RegionContext.GetObservableContext(view); 
     context.PropertyChanged += (s, e) => 
     { 
      var obs = s as ObservableObject<object>; 
      if (obs != null) 
      { 
       var serverInfo = obs.Value as TViewParameter; 
       var vm = container.Resolve<TViewModel>(new ParameterOverride(parameterName, serverInfo)); 
       view.DataContext = vm; 
      } 
     }; 
     return view; 
    } 
} 
0

ナビゲーション時にビューモデルを解決すると、ビューモデルが常に初期化された状態になるという利点があります(遅延を防ぐためにナビゲートするときにすべてのデータを使用できる場合)。機能は、フレームワークには含まれませんよう、プリズムでそれを行うには

は、しかし、あなたは(今のところ、this issueを参照)、変更RegionNavigationServiceを使用する必要があります...

ExecuteNavigation方法を拡張:

[...update journal...] 

// Create and set the view model based on the navigation context 
var viewAsDependencyObject = view as DependencyObject; 
if (viewAsDependencyObject != null) 
{ 
    var createViewModelOnNavigateTo = ViewModelLocator.GetCreateViewModelOnNavigateTo(viewAsDependencyObject); 
    if (createViewModelOnNavigateTo) 
     ViewModelLocator.Bind(view, _viewModelProvider.CreateViewModel(viewAsDependencyObject, navigationContext)); 
} 

[...inform view...] 

その他の変更が含まれます:

  • _viewModelProvider:と同様のサービスをNavigationContext
  • CreateViewModelOnNavigateからのviewmodelsを作成し10:それ
0

に移動するとき、それは新たに作成されたビューモデルを受けるべきであるという見解をマークするAutoWireViewModelに似添付プロパティは、提案やヒントをありがとうございました!私は本当にそれを感謝します!私はブライアンの提案が最も簡単だと思います。私はそれをそのように解決しました:

IRegion region = this._regionManager.Regions [RegionNames.ActionRegion];

 object boxView = region.GetView("BoxDetailsView"); 
     if (boxView == null) 
     { 
      boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>(); 
      region.Add(boxView, "BoxDetailsView"); 
      // Navigate to view 
      var parameters = new NavigationParameters(); 
      parameters.Add("BOXID", param); 
      _regionManager.RequestNavigate(RegionNames.ActionRegion, new Uri("BoxDetailsView" + parameters, UriKind.Relative)); 

     } 
関連する問題