奇怪的 NullReferenceException 和无用的调用堆栈

Strange NullReferenceException and useless Call Stack

我决定将我的 xaml 页面中的布局从 absolut 更改为 stacklayout,之后我的应用程序启动时出现 nullre.. 异常 运行。我从一个到另一个评论了页面中的所有元素,甚至是堆栈布局,但我仍然有错误。我第一次尝试使用 Call Stack,但我看不出我能用它做什么。 在我开始更改我的页面之前,一切都运行良好。 此外,它是 MasterDetailPage 的母版页。 Xaml.cs 文件为空。 现在是xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                 xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors"
                 prism:ViewModelLocator.AutowireViewModel="True"
                 x:Class="GitRemote.Views.MasterPage"
                 Title="Necessary">

      <!--<StackLayout x:Name="MasterMenu"
                   HorizontalOptions="StartAndExpand"
                   VerticalOptions="StartAndExpand">

        --><!--<BoxView x:Name="GrayHeader"
                 Color="#CACED2"
                 HorizontalOptions="StartAndExpand"
                 VerticalOptions="Start"
                 HeightRequest="100"/>--><!--


        --><!--<Image x:Name="MasterProfileImage"
               WidthRequest="50"
               HeightRequest="50"
               Source="ic_account_circle_white_24dp.png"
               HorizontalOptions="Start"
               VerticalOptions="Start"
               Margin="15, 15, 0, 0"/>--><!--

        --><!--<Image x:Name="LogOutImage"
               WidthRequest="45"
               HeightRequest="45"
               Source="ic_menu_logout.png"
               HorizontalOptions="End"
               VerticalOptions="Start"
               Margin="0, 15, 15, 0"/>--><!--

        --><!--<Label x:Name="MasterProfileName"
               Text="GitRemote"
               FontAttributes="Bold"
               FontSize="18"
               HorizontalOptions="Start"
               VerticalOptions="Start"
               TextColor="Black"
               Margin="15, 80, 0, 0"/>--><!--


        --><!--<ListView x:Name="MasterPageMenu"
                  SeparatorColor="Transparent"
                  HorizontalOptions="Start"
                  VerticalOptions="Start"
                  Margin="15, 120, 0, 0"
                  ItemsSource="{Binding MenuItems}"
                  SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
          <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
                <StackLayout Orientation="Horizontal"
                             Spacing="15"
                             Padding="10" >
                  <Label Text="{Binding Name}"
                         FontSize="16"
                         VerticalOptions="Center"
                         FontAttributes="Bold"/>
                  <Image Source="{Binding ImageSource}"
                         WidthRequest="25"
                         HeightRequest="25" />
                </StackLayout>
              </ViewCell>
            </DataTemplate>
          </ListView.ItemTemplate>
          <b:Interaction.Behaviors>
            <b:BehaviorCollection>
              <b:EventToCommand EventName="ItemSelected"
                                Command="{Binding MenuItemSelected}"></b:EventToCommand>
            </b:BehaviorCollection>
          </b:Interaction.Behaviors>
        </ListView>--><!--

      </StackLayout>-->

    </ContentPage>`

**这是之前的样子: ** `

<!--Header-->
<BoxView x:Name="GrayHeader"
         Style="{StaticResource GrayBoxView}"
         AbsoluteLayout.LayoutBounds="{Binding MasterProfileGrayHeaderBounds}"
         AbsoluteLayout.LayoutFlags="All">
</BoxView>

<Image x:Name="MasterProfileImage"
       WidthRequest="50"
       HeightRequest="50"
       Source="ic_account_circle_white_24dp.png"
       AbsoluteLayout.LayoutBounds="{Binding MasterProfileImageBounds}"
       AbsoluteLayout.LayoutFlags="None">
</Image>

<Label x:Name="MasterProfileName"
       Text="GitRemote"
       FontAttributes="Bold"
       FontSize="18"
       AbsoluteLayout.LayoutBounds="{Binding MasterProfileNameBounds}"
       AbsoluteLayout.LayoutFlags="None">
</Label>

<!--Body-->

<ListView x:Name="MasterPageMenu"
          SeparatorColor="Transparent"
          AbsoluteLayout.LayoutBounds="{Binding MasterMenuBounds}"
          AbsoluteLayout.LayoutFlags="None"
          ItemsSource="{Binding MenuItems}"
          SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal" Spacing="15" Padding="10" > 
                    <Label Text="{Binding Name}" FontSize="16" VerticalOptions="Center" FontAttributes="Bold"/>
                    <Image Source="{Binding ImageSource}" WidthRequest="25" HeightRequest="25" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
    <b:Interaction.Behaviors>
      <b:BehaviorCollection>
        <b:EventToCommand EventName="ItemSelected" Command="{Binding MenuItemSelected}"></b:EventToCommand>
      </b:BehaviorCollection>
    </b:Interaction.Behaviors>
</ListView> 

现在这是我的 ViewModel:

    using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;

namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{

    #region Constants
    private const string GistsPageImagePath = "ic_code_black_24dp.png";
    private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
    private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
    private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
    #endregion

    //#region Bindable properties
    //private Rectangle _masterProfileGrayHeaderBounds;

    //public Rectangle MasterProfileGrayHeaderBounds
    //{
    //    get { return _masterProfileGrayHeaderBounds; }
    //    set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
    //}

    //private Rectangle _masterProfileImageBounds;

    //public Rectangle MasterProfileImageBounds
    //{
    //    get { return _masterProfileImageBounds; }
    //    set { SetProperty(ref _masterProfileImageBounds, value); }
    //}

    //private Rectangle _masterProfileNameBounds;

    //public Rectangle MasterProfileNameBounds
    //{
    //    get { return _masterProfileNameBounds; }
    //    set { SetProperty(ref _masterProfileNameBounds, value); }
    //}

    //private Rectangle _masterMenuBounds;

    //public Rectangle MasterMenuBounds
    //{
    //    get { return _masterMenuBounds; }
    //    set { SetProperty(ref _masterMenuBounds, value); }
    //}

    //private MasterPageMenuItemModel _menuItemSelectedProperty;

    //public MasterPageMenuItemModel MenuItemSelectedProperty
    //{
    //    get { return _menuItemSelectedProperty; }
    //    set { SetProperty(ref _menuItemSelectedProperty, value); }
    //}
    ////#endregion

    //private readonly INavigationService _navigationService;

    //public ObservableCollection<MasterPageMenuItemModel> MenuItems;

    //public DelegateCommand MenuItemSelected;

    public MasterPageViewModel()
    {
        //_navigationService = navigationService;
        //MenuItemSelected = new DelegateCommand(OnMenuItemSelected);

        //MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
        //MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
        //MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
        //MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);

        //MenuItems = new ObservableCollection<MasterPageMenuItemModel>
        //{
        //    new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
        //    new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
        //    new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
        //    new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
        //};
    }

    //private void OnMenuItemSelected()
    //{
    //    if ( MenuItemSelectedProperty == null ) return;
    //    _navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
    //    MenuItemSelectedProperty = null;
    //}
}
}

之前:

 using GitRemote.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System.Collections.ObjectModel;
using Xamarin.Forms;

namespace GitRemote.ViewModels
{
public class MasterPageViewModel : BindableBase
{

    #region Constants
    private const string GistsPageImagePath = "ic_code_black_24dp.png";
    private const string IssueDashboardPageImagePath = "ic_slow_motion_video_black_24dp.png";
    private const string BookmarksPageImagePath = "ic_bookmark_black_24dp.png";
    private const string ReportAnIssuePageImagePath = "ic_error_outline_black_24dp.png";
    #endregion

    #region Bindable properties
    private Rectangle _masterProfileGrayHeaderBounds;

    public Rectangle MasterProfileGrayHeaderBounds
    {
        get { return _masterProfileGrayHeaderBounds; }
        set { SetProperty(ref _masterProfileGrayHeaderBounds, value); }
    }

    private Rectangle _masterProfileImageBounds;

    public Rectangle MasterProfileImageBounds
    {
        get { return _masterProfileImageBounds; }
        set { SetProperty(ref _masterProfileImageBounds, value); }
    }

    private Rectangle _masterProfileNameBounds;

    public Rectangle MasterProfileNameBounds
    {
        get { return _masterProfileNameBounds; }
        set { SetProperty(ref _masterProfileNameBounds, value); }
    }

    private Rectangle _masterMenuBounds;

    public Rectangle MasterMenuBounds
    {
        get { return _masterMenuBounds; }
        set { SetProperty(ref _masterMenuBounds, value); }
    }

    private MasterPageMenuItemModel _menuItemSelectedProperty;

    public MasterPageMenuItemModel MenuItemSelectedProperty
    {
        get { return _menuItemSelectedProperty; }
        set { SetProperty(ref _menuItemSelectedProperty, value); }
    }
    #endregion

    private readonly INavigationService _navigationService;

    public ObservableCollection<MasterPageMenuItemModel> MenuItems;

    public DelegateCommand MenuItemSelected;

    public MasterPageViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
        MenuItemSelected = new DelegateCommand(OnMenuItemSelected);

        MasterProfileGrayHeaderBounds = new Rectangle(0, 0, 1, 0.175);
        MasterProfileImageBounds = new Rectangle(16, 16, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
        MasterProfileNameBounds = new Rectangle(16, 70, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);
        MasterMenuBounds = new Rectangle(16, 100 + 10, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize);

        MenuItems = new ObservableCollection<MasterPageMenuItemModel>
        {
            new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
            new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
            new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
            new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
        };
    }

    private void OnMenuItemSelected()
    {
        if ( MenuItemSelectedProperty == null ) return;
        _navigationService.NavigateAsync(MenuItemSelectedProperty.Name, animated: false);
        MenuItemSelectedProperty = null;
    }
}
}

我评论了所有的东西,但我不知道它发生在哪里以及为什么发生。

图片上是我的调用堆栈。但我不知道它是什么意思,我也无能为力。

在 Prism 中,您可以将参数从当前视图模型发送到您导航的页面视图模型。所以我在发送参数,另一方面我在接收它们。但是,在我打电话给他们之前,我并没有检查他们是否存在。于是就有了 NullReferenceException。