先週、mvvm lightを使用して私の新しいWindows 8アプリケーションを開発し始めました。mvvmlight WP7ナビゲーションに精通しています。どのように私はWindows 8で同じことを達成することができます。誰もがWindows 8で同じを達成するためのより良い方法を提案することができます。私たちは、VM内のイベントをオーバーライドし、他のページに移動ハンドル解決策を見つけました。しかし、私はその方法は時代遅れだと思う。いずれか1つは、適切な実装で私を導いてください。前もって感謝します。WindowsでMVVMLightを使用してViewModelを使ってページを移動する8
答えて
これはあなたが探している正確な答えではないと私は理解していますが、これはあなたに探求するためのいくつかのアイデアを与えるかもしれません。
私の場合、私は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);
}
これは役に立ちます。
+1 - 私はこのアプローチが好きです。 "醜い部分"については、ビューのコードビハインド内のビューモデルにサービスを渡す必要がないように、DIコンテナを使用することができます。 – EkoostikMartin
最新バージョンのMVVMLightには、数行のコードでこの機能をそのまま使用できるSimpleIocがあります。 –
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
MVVMライトツールキットでの作業にローランBugnion自身によってちょうど最近MSDNマガジンに掲載された記事を読み、 Windows 8.
記事の最後に、彼はあなたが必要とする正確にどのようにセットアップするかを説明します。
- 1. MVVMLightを使用して、リストボックスのdatatemplate内のトリガーアニメーションをMVVMLightを使用して
- 2. IFrameを使用してWindows 8 Metroアプリケーションの外部ページに移動できますか?
- 3. JavaScriptを使用してページ上のボタンを移動する
- 4. JavaScriptを使用して別のページに移動する方法
- 5. MVVMLightでViewModelのDataContextを設定する
- 6. AngularJsを使用して1ページを別のページに移動する方法
- 7. uiscrollをページに移動し、上下のボタンを使用してページ間を移動します。
- 8. 誤って移動した値を使用する
- 9. jQueryを使ってWindows 8 Metroアプリケーションを構築する
- 10. NUnitを使ってWindows 8 Store Appをテストする
- 11. Windows 8とWindows Phone 8でHTML5/Javascriptを使用したF#ポータブルライブラリの使用
- 12. Qtを使用してディレクトリを移動
- 13. ListBoxを使用してMVVMを使用してTextBoxを移動する
- 14. onClick jQuery .animateを使用してページの最後に移動
- 15. JQueryを使ってページを囲む単一のボックスを移動する
- 16. C#Visual Studioを使用してPDFで特定のページに移動する
- 17. コンソールアプリケーションを使用してWindows Phone 8に接続します
- 18. Visual C++(Windows)を使用してファイル/フォルダをどこから移動するか?
- 19. 別のテンプレートを使用してWordpressでajaxを使ってページをロードする
- 20. SpriteKit - ランダムオブジェクトを作成し、deltatimeを使って移動する
- 21. Jqueryを使って作成したdivを移動する
- 22. VBAを使用してPDF文書内のページを移動する方法
- 23. AndroidでMvvmCrossを使用してViewModelでAndroid.Views.Viewをバインドする
- 24. viewmodelを使用してストアドプロシージャを使用した完全なドロップダウンリスト
- 25. Force.com IDEを使用してSalesforceでレポートを移動する
- 26. Visual BasicでKillを使用してファイルを移動する
- 27. chdirを使用してPythonでディレクトリを移動する
- 28. Tkinterのボタンを使ってアプリケーションの別のページに移動しますか?
- 29. MVC3でSelectListを使用してViewModelをマッピングする
- 30. XAMLでコンストラクタインジェクションを使用してViewModelを宣言する
あなたはVMでOnNavigatedToをオーバーライドする方法、あなたのソリューションを共有してくださいだろうか? –