Xamarin 我的导航错误。PushAsync(新细节页面(猴子))

Xamarin 我的导航错误。PushAsync(新细节页面(猴子)),xamarin,Xamarin,下面是列表视图的旋转木马示例,当我打开Navigation.PushAsync时会有更多内容。列表视图中的项目仅称为第一个项目,在所有项目上单击其名称仅为第一个项目,位置错误 void Handle_ItemSelected(object sender, SelectedItemChangedEventArgs e) { var monkey = ((ListView)sender).SelectedItem as Monkey; if (monk

下面是列表视图的旋转木马示例,当我打开Navigation.PushAsync时会有更多内容。列表视图中的项目仅称为第一个项目,在所有项目上单击其名称仅为第一个项目,位置错误

    void Handle_ItemSelected(object sender, SelectedItemChangedEventArgs e)
   {
        var monkey = ((ListView)sender).SelectedItem as Monkey;

        if (monkey == null)
            return;

        Navigation.PushAsync(new DetailsPage(monkey));
    } 

编辑

MonkeysPage.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"
    x:Class="Monkeys.Views.MonkeysPage"
    xmlns:design="clr-namespace:Monkeys;assembly=Monkeys"
    xmlns:controls="clr-namespace:ImageCircle.Forms.Plugin.Abstractions;assembly=ImageCircle.Forms.Plugin.Abstractions"
    xmlns:cv="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.CarouselView"
        BindingContext="{x:Static design:ViewModelLocator.MonkeysViewModel}"
    x:Name="MonkeysPage"
    Title="Traditional Monkeys">
<ContentPage.Content>
  <ListView ItemsSource="{Binding MonkeysGrouped}"
            ItemSelected="Handle_ItemSelected"
            HasUnevenRows="true"
            GroupShortNameBinding = "{Binding Key}"
            IsGroupingEnabled = "true"
            GroupDisplayBinding = "{Binding Key}">
     <ListView.Header>
      <cv:CarouselView x:Name="CarouselZoos" ItemsSource="{Binding Path=BindingContext.Zoos, Source={x:Reference MonkeysPage}}" HeightRequest="200">
        <cv:CarouselView.ItemTemplate>
          <DataTemplate>
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
              </Grid.RowDefinitions>
              <Image Grid.RowSpan="2" Aspect="AspectFill" Source="{Binding ImageUrl}"/>
              <StackLayout Grid.Row="1" BackgroundColor="#80000000" Padding="12">
                  <Label TextColor="White" Text="{Binding Name}" FontSize="16" HorizontalOptions="Center" VerticalOptions="CenterAndExpand"/>
              </StackLayout>
            </Grid>
          </DataTemplate>
        </cv:CarouselView.ItemTemplate>
      </cv:CarouselView>
    </ListView.Header>
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <Grid Padding="10" RowSpacing="10" ColumnSpacing="10">
            <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto"/>
              <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <controls:CircleImage
                   BorderColor="Aqua"
                   BorderThickness="3"
                   HeightRequest="66"
                   HorizontalOptions="CenterAndExpand"
                   VerticalOptions="CenterAndExpand"
                   Aspect="AspectFill"
                   WidthRequest="66"
                   Grid.RowSpan="2"
                   Source="{Binding Image}"/>
            <Label Grid.Column="1"
                   Text="{Binding Name}"
                   VerticalOptions="End"/>
            <Label Grid.Column="1"
                   Grid.Row="1"
                   VerticalOptions="Start"
                   Text="{Binding Location}"/>
          </Grid>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
<?xml version="1.0" encoding="UTF-8"?>
  <ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="Monkeys.Views.DetailsPage"
    xmlns:design="clr-namespace:Monkeys;assembly=Monkeys"
    xmlns:controls="clr-namespace:ImageCircle.Forms.Plugin.Abstractions;assembly=ImageCircle.Forms.Plugin.Abstractions"
    BindingContext="{x:Static design:ViewModelLocator.DetailsViewModel}"
    Title="{Binding Monkey.Name}">
<ContentPage.Content>
    <ScrollView>
        <StackLayout Padding="10">
            <controls:CircleImage 
                    BorderColor="Aqua"
                    BorderThickness="3"
                    HeightRequest="200"
                    WidthRequest="200"
                    HorizontalOptions="CenterAndExpand"
                    Aspect="AspectFill"
                    Source="{Binding Monkey.Image}"/>
            <Label Text="{Binding Monkey.Name}" FontAttributes="Bold"/>
            <Label Text="{Binding Monkey.Location}" FontSize="Micro"/>
            <Label Text="{Binding Monkey.Details}" FontSize="Large"/>
        </StackLayout>
    </ScrollView>
</ContentPage.Content>
DetailsPage.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"
    x:Class="Monkeys.Views.MonkeysPage"
    xmlns:design="clr-namespace:Monkeys;assembly=Monkeys"
    xmlns:controls="clr-namespace:ImageCircle.Forms.Plugin.Abstractions;assembly=ImageCircle.Forms.Plugin.Abstractions"
    xmlns:cv="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.CarouselView"
        BindingContext="{x:Static design:ViewModelLocator.MonkeysViewModel}"
    x:Name="MonkeysPage"
    Title="Traditional Monkeys">
<ContentPage.Content>
  <ListView ItemsSource="{Binding MonkeysGrouped}"
            ItemSelected="Handle_ItemSelected"
            HasUnevenRows="true"
            GroupShortNameBinding = "{Binding Key}"
            IsGroupingEnabled = "true"
            GroupDisplayBinding = "{Binding Key}">
     <ListView.Header>
      <cv:CarouselView x:Name="CarouselZoos" ItemsSource="{Binding Path=BindingContext.Zoos, Source={x:Reference MonkeysPage}}" HeightRequest="200">
        <cv:CarouselView.ItemTemplate>
          <DataTemplate>
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
              </Grid.RowDefinitions>
              <Image Grid.RowSpan="2" Aspect="AspectFill" Source="{Binding ImageUrl}"/>
              <StackLayout Grid.Row="1" BackgroundColor="#80000000" Padding="12">
                  <Label TextColor="White" Text="{Binding Name}" FontSize="16" HorizontalOptions="Center" VerticalOptions="CenterAndExpand"/>
              </StackLayout>
            </Grid>
          </DataTemplate>
        </cv:CarouselView.ItemTemplate>
      </cv:CarouselView>
    </ListView.Header>
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <Grid Padding="10" RowSpacing="10" ColumnSpacing="10">
            <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto"/>
              <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <controls:CircleImage
                   BorderColor="Aqua"
                   BorderThickness="3"
                   HeightRequest="66"
                   HorizontalOptions="CenterAndExpand"
                   VerticalOptions="CenterAndExpand"
                   Aspect="AspectFill"
                   WidthRequest="66"
                   Grid.RowSpan="2"
                   Source="{Binding Image}"/>
            <Label Grid.Column="1"
                   Text="{Binding Name}"
                   VerticalOptions="End"/>
            <Label Grid.Column="1"
                   Grid.Row="1"
                   VerticalOptions="Start"
                   Text="{Binding Location}"/>
          </Grid>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
<?xml version="1.0" encoding="UTF-8"?>
  <ContentPage 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    x:Class="Monkeys.Views.DetailsPage"
    xmlns:design="clr-namespace:Monkeys;assembly=Monkeys"
    xmlns:controls="clr-namespace:ImageCircle.Forms.Plugin.Abstractions;assembly=ImageCircle.Forms.Plugin.Abstractions"
    BindingContext="{x:Static design:ViewModelLocator.DetailsViewModel}"
    Title="{Binding Monkey.Name}">
<ContentPage.Content>
    <ScrollView>
        <StackLayout Padding="10">
            <controls:CircleImage 
                    BorderColor="Aqua"
                    BorderThickness="3"
                    HeightRequest="200"
                    WidthRequest="200"
                    HorizontalOptions="CenterAndExpand"
                    Aspect="AspectFill"
                    Source="{Binding Monkey.Image}"/>
            <Label Text="{Binding Monkey.Name}" FontAttributes="Bold"/>
            <Label Text="{Binding Monkey.Location}" FontSize="Micro"/>
            <Label Text="{Binding Monkey.Details}" FontSize="Large"/>
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

除了忘记将SelectedItem重置为null之外,您做的一切都很好,这就是为什么总是单击第一个列表项的原因

您的代码应该如下所示:

async void Handle_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
     var monkey = e.SelectedItem as Monkey;

     if (monkey == null)
        return;

     await Navigation.PushAsync(new DetailsPage(monkey)); // always await Navigations
     ((ListView)sender).SelectedItem = null;
}
另外,使你的方法异步,这样你就不会导致UI线程阻塞

编辑

尝试从SelectedItemChangedEventArgs获取所选项目

var monkey = e.SelectedItem as Monkey;
更新

好的,SelectedItem已成功更新,但DetailsPage后面的ViewModel上的“Monkey项”未更新

因此,在DetailsPage中添加这一行:

public partial class DetailsPage : ContentPage
{
    public DetailsPage(Monkey monkey)
    {
        InitializeComponent();
        BindingContext = new DetailsViewModel(monkey); // Update the BindingContext
    }
}
并删除DetailsPage.xaml上的这一行:

BindingContext="{x:Static design:ViewModelLocator.DetailsViewModel}"

尝试使用e.SelectedItem代替代替。相同错误仅打开第一个错误发生时,仅从第一个位置打开项目我进行了更改并引发相同错误仅打开第一个项目,xaml可能会影响某些内容,请查看我上面的编辑xaml您是否可以使用有关ListView实现的更多代码编辑您的问题?你的代码中一定有其他错误,因为这对我来说是有效的…@José请也添加.cs类我正在遵循这个示例应用程序