基本上,你有兩個選擇:
1.使用導航服務
您可以定義一個INavigationService
接口,並把它傳遞到您的視圖模型裝配所有的ViewModels(假設你使用不同的組件,其確保不引用視圖模型的視圖並因此違反MVVM模式)非常重要。
public interface INavigationService
{
void Navigate(string page, object parameter);
}
在你的viewmodels中,你可以簡單地用navigationService.Navigate("UserEditPage", selectedUser.Id);
來調用它。
實現可以簡單到
public class WinRtNavigationService : INavigationService
{
public void Navigate(string page, object parameter)
{
Type pageType = Type.GetType(string.Format("YourCompany.YourApp.ViewModels.{0}", page));
((Frame)Window.Current.Content).Navigate(pageType, parameter);
}
}
你用這個,如果你有需要的的ViewModels導航。
2.使用行爲
您可以使用行爲可重複使用的導航支持XAML直接添加,因此完全避免了後面的代碼。
爲此,Blend提供交互觸發器和NavigateToPageAction
行爲。
<Page
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:c="using:Microsoft.Xaml.Interactions.Core" >
....
<Button Content="Edit">
<i:Interaction.Behaviors>
<i:BehaviorCollection>
<c:EventTriggerBehavior EventName="Tapped">
<c:NavigateToPageAction TargetPage="YourCompany.YourApp.ViewModel.UserEditPage" Parameter="{Binding Path=SelectedUser.Id}" />
</c:EventTriggerBehavior>
</i:BehaviorCollection>
</i:Interaction.Behaviors>
</Button>
...
</Page>
混合行爲/相互作用觸發器通常用於導航功能結合的按鈕或其他用戶界面元素(即點擊哪些不必是按鈕的圖片),因爲它不需要任何代碼在Code Behind或ViewModel中。
如果導航是一些驗證後發生,即你有用戶註冊一個多頁表格,你有一個「發送」按鈕綁定到一個RegisterCommand
和RegisterCommand
做聯機驗證,你就需要回到上一頁,你想使用INavigationService
。
如何_「我需要遵循MVVM模式與這個應用程序」_不使用代碼隱藏?你平常的做法應該很好。 「MVVM」僅解決程序的數據問題;隱含的是控制器的概念,並且沒有任何關於排除編寫命令性代碼來影響UI狀態變化的模式,特別是當它們由於用戶輸入事件而發生時。 –
在代碼隱藏中佈線導航並不是最簡單的方式,因爲代碼隱藏除了與視圖相關的問題(動畫,可重用的用戶控件)之外應該主要是空的,因爲在代碼隱藏中編寫的任何代碼都與該代碼緊密耦合特定的視圖(在可重用用戶控件的情況下,這很好)。這裏 – Tseng
@Tseng嘗試了行爲選項,但得到了與名稱空間中不存在的行爲有關的一些錯誤,在下面對您的答案留下了評論。 –