2015-05-09 2 views
0

Я начал проект Windows Universal после шаблона MVVM и пришел к ситуации, когда мне нужно перейти на другую страницу нажатием кнопки.Как выполнить Просмотр навигации с помощью MVVM? Win RT

Обычно я хотел бы сделать это в коде за помощью щелчка события кнопки как ниже:

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

     } 

Но так как мне нужно следовать шаблону MVVM с этим приложением, я задаюсь вопросом, как я должен настроить навигацию к новому клику на кнопке?

Я столкнулся с ICommand для этой задачи в решении WPF после поиска Google, но не на 100% о том, как это должно быть реализовано для этой Windows Universal Framework.

+0

Как _ «Мне нужно следовать шаблону MVVM с помощью этого приложения» _, исключая использование кода? Ваш обычный подход должен работать нормально. «MVVM» адресует только аспекты данных вашей программы; неявная концепция контроллера, и нет ничего о шаблоне, который исключает возможность написания императивного кода для осуществления изменений в состоянии пользовательского интерфейса, особенно когда они должны произойти в результате события ввода пользователя. –

+0

Проводка навигации по коду не является самым чистым способом ее выполнения, поскольку код-код должен быть в основном пустым, за исключением проблем, связанных с просмотром (анимации, многоразовые пользовательские элементы управления), поскольку любой код, написанный в коде, тесно связан с этим (что отлично подходит для многократных пользовательских элементов управления). Здесь – Tseng

+0

@Tseng попробовал вариант поведения, но некоторые ошибки, связанные с поведением, не существующим в пространствах имен, оставили комментарий к вашему ответу ниже. –

ответ

2

В основном у вас есть два варианта

1. Используйте навигационное обслуживание

Вы можете определить интерфейс INavigationService и передать его всем своим ViewModels в вашей ViewModel сборки (если вы используете различные узлы, которые важно следить за тем, чтобы вы не ссылались на представление из своей модели просмотра и, следовательно, нарушали шаблон 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> 

Смешать Поведения/Взаимодействие Триггеры обычно используются для привязки навигационных функций кнопок или других элементов пользовательского интерфейса (например, нажмите на картинку, которая не должны быть кнопка), так как он не требует какого-либо кода в пределах кода Behind или ViewModel.

Если после некоторой проверки произошла навигация, то есть у вас есть многостраничная форма для регистрации пользователя, и у вас есть кнопка «Отправить», привязанная к RegisterCommand, а RegisterCommand выполняет онлайн-проверку, и вам требуется вернитесь на предыдущую страницу, вы хотите использовать INavigationService.

+0

Итак, решение по решению для этого решения удалось довести до 6 ошибок, http://hastebin.com/jatigodozi.tex. Я добавил ссылку на SDK Behaviors и определил приведенные выше имена в этой странице. но все же получить вышеупомянутые ошибки, любые идеи, как это решить? http://hastebin.com/sawafohoru.xml –

+0

Возможно, вам придется ссылаться на сборки Blend – Tseng

+0

Я уже добавил эту ссылку, но взаимодействия все еще не найдены в ns http://picpaste.com/behavior_assem -HF977fHB.PNG –