先週、mvvm light を使用して新しい Windows 8 アプリケーションの開発を開始しました。mvvmlight WP7 ナビゲーションに精通しています。Windows 8で同じことを達成するにはどうすればよいですか。Windows 8で同じことを達成するためのより良い方法を提案できますか。vmでonnavigatedイベントをオーバーライドし、他のページへのナビゲートを処理する解決策を見つけました。しかし、その方法は時代遅れだと思います。適切な実装を教えてください。前もって感謝します。
3 に答える
これがあなたが探している正確な答えではないことは理解していますが、これはあなたが探求するいくつかのアイデアを与えるかもしれません.
私の場合、MVVMLight は使用していませんが、独自の単純な MVVM 実装を使用しています。プロパティ通知にはBindableBase
クラス (デフォルトの VS 2012 RC テンプレートに付属) を使用します。MVVMLight を使用して、以下のようなもので補完できるインフラストラクチャの一部を提供できると思います。
ナビゲーションのために、次のようなインターフェイスを定義します。
public interface INavigationService
{
void Navigate(Type type);
void Navigate(Type type, object parameter);
void EnsureNavigated(Type pageType, object parameter);
bool CanGoBack { get; }
bool CanGoForward { get; }
void GoBack();
void GoForward();
IView CurrentView { get; }
}
そして、次のように実装します。
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
になりました。私の場合、ページのコード ビハインドでビューモデルを作成します。
public HomePage()
{
this.InitializeComponent();
var _navigationService = NavigationService.GetFor(this.ContentFrame);
DataContext = new HomePageViewModel(_navigationService);
}
お役に立てれば。
MVVM Light Toolkit と Windows 8 の操作について、Laurent Bugnion 自身が最近 MSDN Magazine に掲載した記事をお読みください。
記事の終わりに向かって、NavigationService
必要なセットアップ方法を正確に説明しています。
MVVMLight にあった NavigationService は、WinRTBehaviors という新しいパッケージに移行されました。また、どちらも nuget から、Win8nl で EventToCommand を取得できます。ここに投稿された私のブログを参照してください:
Windows 8、EventToCommand、および動作用の MVVM Light を使用した開始 http://blog.tattoocoder.com/2012/08/getting-started-w-windows-8-mvvm-light.html