2012-06-10 14 views
10

先週、mvvm lightを使用して私の新しいWindows 8アプリケーションを開発し始めました。mvvmlight WP7ナビゲーションに精通しています。どのように私はWindows 8で同じことを達成することができます。誰もがWindows 8で同じを達成するためのより良い方法を提案することができます。私たちは、VM内のイベントをオーバーライドし、他のページに移動ハンドル解決策を見つけました。しかし、私はその方法は時代遅れだと思う。いずれか1つは、適切な実装で私を導いてください。前もって感謝します。WindowsでMVVMLightを使用してViewModelを使ってページを移動する8

+0

あなたはVMでOnNavigatedToをオーバーライドする方法、あなたのソリューションを共有してくださいだろうか? –

答えて

15

これはあなたが探している正確な答えではないと私は理解していますが、これはあなたに探求するためのいくつかのアイデアを与えるかもしれません。

私の場合、私はMVVMLightを使用していませんが、私自身の簡単なMVVMの実装です。私はプロパティの通知のためにBindableBaseクラス(デフォルトのVS 2012 RCテンプレートに付属)を使用します。 MVVMLightを使用してインフラストラクチャを提供することができます。インフラストラクチャの一部は、以下のようなもので補完できます。

は、ナビゲーションのために、私は次のようになりますインターフェイスを定義:

を、次のように実装:

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Windows.UI.Xaml.Controls; 

public class NavigationService : INavigationService 
{ 
    private readonly Frame _frame; 

    public NavigationService(Frame frame) 
    { 
     _frame = frame; 
     _frame.Navigated += OnFrameNavigated; 
    } 

    private void OnFrameNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) 
    { 
     var view = e.Content as IView; 
     if (view == null) 
      return; 

     var navMsg = new NavigationMessage() 
     { 
      Sender = this, 
      NewView = view, 
      Parameter = e.Parameter, 
      NavigationMode = (int)e.NavigationMode 
     }; 

     EventManager.Current.Publish(navMsg); 

     //Anything that the parent needs to be notified should happen in of after this method 
     var viewModel = view.ViewModel; 
     if (viewModel != null) 
      viewModel.Initialise(e.Parameter); 
    } 

    public void Navigate(Type pageType) 
    { 
     DisposePreviousView(); 
     _frame.Navigate(pageType); 
    } 

    public void Navigate(Type pageType, object parameter) 
    { 
     DisposePreviousView(); 
     _frame.Navigate(pageType, parameter); 
    } 

    private void DisposePreviousView() 
    { 
     var currentView = this.CurrentView; 
     var currentViewDisposable = currentView as IDisposable; 
     if (currentViewDisposable != null) 
     { 
      currentViewDisposable.Dispose(); 
      currentViewDisposable = null; 
     } //view model is disposed in the view implementation 
    } 

    public void EnsureNavigated(Type pageType, object parameter) 
    { 
     var currentView = this.CurrentView; 
     if (currentView == null || currentView.GetType() != pageType) 
     { 
      Navigate(pageType, parameter); 
     } 
    } 

    public IView CurrentView 
    { 
     get { return _frame.Content as IView; } 
    } 


    public bool CanGoBack 
    { 
     get { return _frame != null && _frame.CanGoBack; } 
    } 

    public void GoBack() 
    { 
     // Use the navigation frame to return to the previous page 
     if (_frame != null && _frame.CanGoBack) _frame.GoBack(); 
    } 

    public bool CanGoForward 
    { 
     get { return _frame != null && _frame.CanGoForward; } 
    } 

    public void GoForward() 
    { 
     // Use the navigation frame to return to the previous page 
     if (_frame != null && _frame.CanGoForward) _frame.GoForward(); 
    } 

} 

たIView:

public interface IView : IDisposable 
{ 
    IViewModel ViewModel { get; } 
    void Refresh(); 
} 

IViewModel:

public interface IViewModel : INotifyPropertyChanged, IDisposable 
{ 
    void Initialise(object parameter); 
    string ViewTitle { get; } 
    void Refresh(); 
} 

最後に、XAMLページで、Frame要素定義:

<Frame x:Name="ContentFrame" /> 

をして、ページのコードビハインドで:(この私の意見では唯一の醜い部分で - しかし、そのうまくいけば、あまりにも悪くはありません):

var _navigationService = new NavigationService(this.ContentFrame); 

_navigationServiceをviewmodelに渡すことができます。私の場合は、ページのコードビハインドでビューモデルを作成します。

public HomePage() 
{ 
    this.InitializeComponent(); 

    var _navigationService = NavigationService.GetFor(this.ContentFrame); 

    DataContext = new HomePageViewModel(_navigationService); 

} 

これは役に立ちます。

+0

+1 - 私はこのアプローチが好きです。 "醜い部分"については、ビューのコードビハインド内のビューモデルにサービスを渡す必要がないように、DIコンテナを使用することができます。 – EkoostikMartin

+0

最新バージョンのMVVMLightには、数行のコードでこの機能をそのまま使用できるSimpleIocがあります。 –

2

MVVMLightにあったNavigationServiceは、WinRTBehaviorsという新しいパッケージに移行されました。また、Win8nlのEventToCommandをnugetから取得することもできます。参照してください私のブログはここに掲載:

をWスタート/ MVVMライトのWindows 8、EventToCommandと行動のための http://blog.tattoocoder.com/2012/08/getting-started-w-windows-8-mvvm-light.html

4

MVVMライトツールキットでの作業にローランBugnion自身によってちょうど最近MSDNマガジンに掲載された記事を読み、 Windows 8.

記事の最後に、彼はあなたが必要とする正確にどのようにセットアップするかを説明します。

http://msdn.microsoft.com/en-us/magazine/jj651572.aspx

関連する問題