Ошибка в методе, обеспечивающем навигацию между страницами - PullRequest
0 голосов
/ 22 марта 2020

Я работаю над приложением, которое изначально было написано на C# (включая пользовательский интерфейс), но теперь я переписываю его так, чтобы пользовательский интерфейс обрабатывался xml. Каждая часть приложения работала нормально, когда все было в C#, однако теперь, когда я переключил пользовательский интерфейс на xml, я получаю сообщение об ошибке в моих ViewModels.

error: 'StartPageViewModel' не содержит определения для «Навигации» и не найден доступный метод расширения «Навигация», принимающий первый аргумент типа «StartPageViewModel» (отсутствует директива using или ссылка на сборку?)

XML

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:d="http://xamarin.com/schemas/2014/forms/design"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         x:Class="SampleApp.Views.StartPage">
<ContentPage.Content>
    <StackLayout>
        <Grid VerticalOptions="CenterAndExpand">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <Button x:Name="OnePlayerGame" Text="One Player Game" 
                    Command="{Binding StartOnePlayerGameCommand}" 
                    Grid.Row="0" Grid.Column="0" 
                    HorizontalOptions="Center"/>
            <Button x:Name="TwoPlayerGame" Text="Two Player Game" 
                    Command="{Binding StartTwoPlayerGameCommand}"
                    Grid.Row="0" Grid.Column="1" HorizontalOptions="Center" />
        </Grid>
    </StackLayout>
</ContentPage.Content>

Код позади

namespace SampleApp.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class StartPage : ContentPage
{
    public StartPage()
    {
        InitializeComponent();
        BindingContext = new StartPageViewModel();
    }
}
}

Код модели представления

namespace SampleApp.ViewModels
{
class StartPageViewModel : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public Command StartOnePlayerGameCommand { get; set; }
    public Command StartTwoPlayerGameCommand { get; set; }

    public StartPageViewModel()
    {
        StartOnePlayerGameCommand = new Command(() => StartOnePlayerGame());
        StartTwoPlayerGameCommand = new Command(() => StartTwoPlayerGame());
    }

    private void StartOnePlayerGame()
    {
        //the error is here (Navigation has a red squigly under it)
        this.Navigation.PushAsync(new Views.OnePlayerPage());
    }

    private void StartTwoPlayerGame()
    {
        //the error is here (Navigation has a red squigly under it)
        this.Navigation.PushAsync(new Views.NameEntryPage());
    }
}
}

1 Ответ

0 голосов
/ 23 марта 2020

Navigation является свойством Page, и вы можете передать навигацию через конструктор ViewModel, а затем использовать его в ViewModel:

class StartPageViewModel : INotifyPropertyChanged
{

    public INavigation myNavigation { get; set; }

    public StartPageViewModel(INavigation navigation)
    {
        myNavigation = navigation;

        StartOnePlayerGameCommand = new Command(() => StartOnePlayerGame());
        StartTwoPlayerGameCommand = new Command(() => StartTwoPlayerGame());
    }

    private void StartOnePlayerGame()
    {
        //the error is here (Navigation has a red squigly under it)
        myNavigation.PushAsync(new Views.OnePlayerPage());
    }

    private void StartTwoPlayerGame()
    {
        //the error is here (Navigation has a red squigly under it)
        myNavigation.PushAsync(new Views.NameEntryPage());
    }
}

Передать его со страницы:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        this.BindingContext = new StartPageViewModel(Navigation);
    }
}

Другой способ, которым вы можете попытаться использовать Application.Current.MainPage.Navigation:

private async void StartOnePlayerGame()
{
    //the error is here (Navigation has a red squigly under it)

    await Application.Current.MainPage.Navigation.PushAsync(new Views.OnePlayerPage());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...