Чистый MVVM-способ сделать это состоит в том, чтобы абстрагировать навигацию и вызвать ее из вашей модели представления (см. Служба навигации Prism в качестве ссылки).В любом случае, при внедрении такого навигационного сервиса могут возникнуть некоторые подводные камни.Если это будет возможно, я бы предложил интегрировать Prism в ваше решение и использовать полную версию MVVM.
Однако существует гибридный подход, который было бы намного проще реализовать, но он не является чисто MVVM.Предполагая, что вы не вводите зависимости, вы можете определить свою привязку непосредственно в вашей XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:App1"
xmlns:generic="clr-namespace:System.Collections.Generic;assembly=netstandard"
x:Class="App1.MainPage"
x:Name="Page">
<ContentPage.BindingContext>
<local:ViewModel />
</ContentPage.BindingContext>
<!-- Your content goes here -->
</ContentPage>
В вашей модели представления вы можете теперь определить команду для входа пользователя в систему и событие, которое используется для связи с вашим представлением.что пользователь успешно вошел в систему (обратите внимание, что этот код сокращен до минимальный )
class ViewModel
{
/// <summary>Initializes a new instance of the <see cref="T:System.Object"></see> class.</summary>
public ViewModel()
{
LogInCommand = new Command(OnLogIn);
}
private void OnLogIn()
{
// your login logic shall go here
// your password and user name shall be bound
// via other properties
// Invoke the LoggedIn event with the user name
// of the logged in user.
LoggedIn?.Invoke(userName);
}
public event Action<string> LoggedIn;
public Command LogInCommand { get; }
}
С вашей точки зрения вы можете подписаться на LoggedIn
<ContentPage.BindingContext>
<local:ViewModel LoggedIn="ViewModel_OnLoggedIn" />
</ContentPage.BindingContext>
И, конечно, вам нужен соответствующий метод в вашем коде (файл .xaml.cs
)
private void ViewModel_OnLoggedIn(string obj)
{
// navigate the other page here
}
Это не решение, которое вы можете подключить напрямую, но вам следует указать направильное направление. Обратите внимание, , что вам придется привязать Button
или что-то еще к LogInCommand
, а также записи в свойствах для имени пользователя и пароля.