上週我剛開始使用mvvm light開發我的全新Windows 8應用程序。我熟悉mvvmlight WP7導航。我怎樣才能在Windows 8中實現相同的任何人可以提出一個更好的方法來實現在Windows 8中的相同。我找到了一個解決方案,我們在VM中重寫onnavigated事件並處理導航到其他頁面。但我認爲這種方法已經過時了。任何人請指導我正確的實施。提前致謝。通過ViewModel在Windows 8中使用MVVMLight進行頁面導航
回答
我知道這不是您可能正在尋找的確切答案,但這可能會給您一些探索的想法。
在我的情況下,我沒有使用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的新包中。您也可以從nuget獲得Win8nl中的EventToCommand。見我的博客張貼在這裏:
入門W/MVVM燈適用於Windows 8,EventToCommand和行爲 http://blog.tattoocoder.com/2012/08/getting-started-w-windows-8-mvvm-light.html
閱讀洛朗比尼翁本人發表在MSDN雜誌最近剛與MVVM光工具包工作的文章, Windows 8.
在文章結尾處,他詳細解釋瞭如何設置您需要的NavigationService
。
- 1. 使用Bootstrap進行頁面導航
- 2. 在Windows 8/Windows Phone 8中使用可移植類庫MVVM - 頁面導航
- 3. 在MVVMLight中使用TabControl進行導航Silverlight4
- 4. 使用JQuery進行頁面導航
- 5. Windows 8中的頁面導航XAML(不使用代碼)
- 6. 通過頁面導航
- 7. 是否可以使用導航uri的hyperlinkbutton xaml頁面在Windows 8應用程序中導航頁面?
- 8. 如何使用Windows Phone 8中的對象進行導航?
- 9. 使用HTML/JavaScript/Apache的Windows Phone 8上的頁面導航Cordova
- 10. 導航從html頁面到Windows 8 xaml頁面
- 11. 應用程序無法導航到Windows 8中的新頁面
- 12. 項目Windows 8應用程序中的頁面導航錯誤
- 13. 在Windows 8應用程序頁面之間導航
- 14. 在使用頁腳進行導航時管理多個頁面
- 15. 在Windows Phone 8中導航到相同的頁面
- 16. 如何從非派生的PhoneApplicationPage進行頁面導航Windows手機8
- 17. 導航&reinstanciate頁面/ viewmodel構造函數
- 18. 在Windows Phone 8中使用jquery mobile進行頁面導航時出現的問題
- 19. 在windows phone上通過頁面導航傳遞二進制數據
- 20. 在Windows Phone上使用MVVM進行ListBox頁面導航的正確方法
- 21. 如何在使用MVVM進行導航時刷新ViewModel
- 22. Windows Phone 8.1 - 頁面導航
- 23. Windows Phone 7頁面導航
- 24. Windows Phone的頁面導航
- 25. 如何從導航堆棧中刪除頁面 - 的C#Windows 8
- 26. 在Android上使用Basic4android進行頁面導航
- 27. Struts 2:通過鏈接導航頁面
- 28. 通過導航離開頁面
- 29. 導航要在Windows Phone 8
- 30. 在angularjs中通過頁面導航時添加翻頁動畫
請您分享您的解決方案,你怎麼在VM overrided的OnNavigatedTo? –