先週、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. FreshMvvmでToolBarItemを使用してTabbedページに移動する
- 4. node.jsを使用してWebページ内を移動する
- 5. リアクションを使用してページ間を移動する
- 6. JavaScriptを使用してページ上のボタンを移動する
- 7. ファントムを使用してページ間を移動する方法
- 8. MVVMLightでViewModelのDataContextを設定する
- 9. ReduxとReact-routerを使用してページを移動します。
- 10. JavaScriptを使用して別のページに移動する方法
- 11. crawlspiderを使って次のページに移動するには?
- 12. リバースを使用して別のアセンブリでページに移動
- 13. は、Windows上で実行されているodoo 8を使用してodoo 8
- 14. シェフを使用しているWindows 2008R2サーバーのファイルを移動して移動しますか?
- 15. AngularJsを使用して1ページを別のページに移動する方法
- 16. uiscrollをページに移動し、上下のボタンを使用してページ間を移動します。
- 17. Daggerを使用してViewModelを注入する2 + Kotlin + ViewModel
- 18. 誤って移動した値を使用する
- 19. NUnitを使ってWindows 8 Store Appをテストする
- 20. jQueryを使ってWindows 8 Metroアプリケーションを構築する
- 21. Windows 8とWindows Phone 8でHTML5/Javascriptを使用したF#ポータブルライブラリの使用
- 22. OpenGLを使って3Dオブジェクトをスケーリングして移動する
- 23. REST APIを使用してコンフルエンスで子ページを移動する方法
- 24. MVVMLight ValueChangedイベントリスナーは、私がWhenSourceChanges()を使用して、私のviewmodelのbooleanプロパティにバインドしています私のXamarin.Android活動にバインディングを設定している
- 25. HtmlUnitを使用して次のaspxページに移動
- 26. PHPを使用して別のhtmlページに移動
- 27. onClick jQuery .animateを使用してページの最後に移動
- 28. ListBoxを使用してMVVMを使用してTextBoxを移動する
- 29. スライダーユニティを使用してプレハブを移動
- 30. Qtを使用してディレクトリを移動
あなたはVMでOnNavigatedToをオーバーライドする方法、あなたのソリューションを共有してくださいだろうか? –