2015-05-09 40 views
0

我已經按照MVVM模式啓動了Windows Universal項目,並且遇到了需要使用按鈕單擊導航到另一個頁面的情況。如何使用MVVM執行視圖導航? Win RT

通常我會在代碼中做到這一點的背後使用按鈕的單擊事件像下面:

 private void AppBarButton_Click(object sender, RoutedEventArgs e) 
     { 
      // Navigation Without parameters 
      this.Frame.Navigate(typeof(SecondPage)); 

     } 

但因爲我需要遵循這個程序MVVM模式,我不知道我應該怎麼設置導航到新的查看按鈕點擊?

在谷歌搜索之後,我遇到過ICommand在WPF解決方案中執行此任務,但在此Windows通用框架中應該如何實現該任務不是100%。

+0

如何_「我需要遵循MVVM模式與這個應用程序」_不使用代碼隱藏?你平常的做法應該很好。 「MVVM」僅解決程序的數據問題;隱含的是控制器的概念,並且沒有任何關於排除編寫命令性代碼來影響UI狀態變化的模式,特別是當它們由於用戶輸入事件而發生時。 –

+0

在代碼隱藏中佈線導航並不是最簡單的方式,因爲代碼隱藏除了與視圖相關的問題(動畫,可重用的用戶控件)之外應該主要是空的,因爲在代碼隱藏中編寫的任何代碼都與該代碼緊密耦合特定的視圖(在可重用用戶控件的情況下,這很好)。這裏 – Tseng

+0

@Tseng嘗試了行爲選項,但得到了與名稱空間中不存在的行爲有關的一些錯誤,在下面對您的答案留下了評論。 –

回答

2

基本上,你有兩個選擇:

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中。

如果導航是一些驗證後發生,即你有用戶註冊一個多頁表格,你有一個「發送」按鈕綁定到一個RegisterCommandRegisterCommand做聯機驗證,你就需要回到上一頁,你想使用INavigationService

+0

因此決定了此解決方案的行爲解決方案,現在設法將其降至6個錯誤,http://hastebin.com/jatigodozi.tex我添加了對Behaviors SDK的引用,並在頁面中定義了上述NameSpaces但仍然得到上述錯誤,任何想法如何解決? http://hastebin.com/sawafohoru.xml –

+0

您可能需要引用Blend程序集 – Tseng

+0

我已經添加了該引用,但交互仍然未在ns中找到http://picpaste.com/behavior_assem -HF977fHB.PNG –