В основном у вас есть два варианта
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
.
Как _ «Мне нужно следовать шаблону MVVM с помощью этого приложения» _, исключая использование кода? Ваш обычный подход должен работать нормально. «MVVM» адресует только аспекты данных вашей программы; неявная концепция контроллера, и нет ничего о шаблоне, который исключает возможность написания императивного кода для осуществления изменений в состоянии пользовательского интерфейса, особенно когда они должны произойти в результате события ввода пользователя. –
Проводка навигации по коду не является самым чистым способом ее выполнения, поскольку код-код должен быть в основном пустым, за исключением проблем, связанных с просмотром (анимации, многоразовые пользовательские элементы управления), поскольку любой код, написанный в коде, тесно связан с этим (что отлично подходит для многократных пользовательских элементов управления). Здесь – Tseng
@Tseng попробовал вариант поведения, но некоторые ошибки, связанные с поведением, не существующим в пространствах имен, оставили комментарий к вашему ответу ниже. –