簡體   English   中英

App.xaml MVVM 燈中的空引用錯誤

[英]Null reference error in App.xaml MVVM light

我將在一個窗口中創建一個 WPF 應用程序,並通過更改Frame的內容來瀏覽我的應用程序。 為此,我使用了 MVVM 燈。

但是在App.xaml我在 Visual Studio 的錯誤列表中遇到了這個錯誤。

你調用的對象是空的。

這是發生錯誤的代碼:

<Application 
    x:Class="Project.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Project" 
    StartupUri="MainWindow.xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    d1p1:Ignorable="d" 
    xmlns:vm="clr-namespace:Project.ViewModel"
    xmlns:services="clr-namespace:Project.Services"
    xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
    <Application.Resources>
        <ResourceDictionary>
            <services:IocContainer x:Key="ioc" />
            <vm:ApplicationViewModel x:Key="appvm" d:IsDataSource="True" /> <!-- error happens on this line -->
        </ResourceDictionary>
    </Application.Resources>
</Application>

這是我的MainWindow

<Window x:Class="Project.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Project"
        mc:Ignorable="d"
        DataContext="{StaticResource appvm}"
        Title="Project" Height="450" Width="800">
    <Frame>
        <Frame.Content>
            <Page Content="{Binding CurrentPage, Mode=TwoWay}" />
        </Frame.Content>
    </Frame>
</Window>

這是我從ViewModelBase繼承的ApplicationViewModel

public class ApplicationViewModel : ViewModelBase
{
    private Page _currentPage = IocContainer.Ioc.StartScreenPage;

    public Page CurrentPage
    {
        get
        {
            return _currentPage;
        }
        set
        {
            if (_currentPage != value)
            {
                _currentPage = value;
                OnPropertyChanged();
            }
        }
    }

    public StartScreenViewModel StartScreenViewModel
    {
        get
        {
            return (App.Current.Resources["ioc"] as IocContainer)?.StartScreenViewModel;
        }
    }

    public void Navigate(Type sourcePageType)
    {
    }
}

這是實現INotifyPropertyChangedViewModelBase

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            Debug.WriteLine("PropertyChanged is niet null ☺");
        }
        else
        {
            Debug.WriteLine("PropertyChanged is null");
        }
    }
}

這是我的 IoC 容器:

public class IocContainer
{
    static IocContainer()
    {
        SimpleIoc.Default.Register<ApplicationViewModel>(false);
        SimpleIoc.Default.Register<StartScreenViewModel>(false);
        SimpleIoc.Default.Register<StartScreenPage>(false);
    }

    public static IocContainer Ioc
    {
        get { return App.Current.Resources["ioc"] as IocContainer; }
    }

    public ApplicationViewModel ApplicationViewModel
    {
        get { return SimpleIoc.Default.GetInstance<ApplicationViewModel>(); }
    }

    public StartScreenPage StartScreenPage
    {
        get { return SimpleIoc.Default.GetInstance<StartScreenPage>(); }
    }

    public StartScreenViewModel StartScreenViewModel
    {
        get { return SimpleIoc.Default.GetInstance<StartScreenViewModel>(); }
    }
}

這是我的StartScreenPage

<Page x:Class="Project.StartScreenPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Project"
      mc:Ignorable="d" 
      DataContext="{Binding StartScreenViewModel, Source={StaticResource ioc}}"
      Title="StartScreen">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
        </Grid.ColumnDefinitions>

        <Label Content="Hello world" Grid.Row="0" Grid.Column="0" />
    </Grid>
</Page>

這是StartScreenViewModel

public class StartScreenViewModel : ViewModelBase
{ }

所有應用程序、窗口和頁面都有一個調用InitializeComponent的默認構造函數。

我可以運行我的應用程序,但我看到一個空窗口。

我忘了什么嗎?

編輯:繼續我對這個問題的回答: Page can only have Frame as parent 而not Window ,我已將MainWindow代碼更改為:

MainWindow上的代碼必須是這樣的:

 <!-- Opening Window tag with all attributes --> <Frame Content="{Binding CurrentPage, Mode=TwoWay}" /> <!-- Closing Window tag -->

這還將在窗口上顯示StartScreenPage

但是,仍然會拋出空引用錯誤。

您的代碼中幾乎沒有空檢查,這就是發生這種情況的地方。

找到問題的最好方法是轉到 Visual Studio 工具面板

調試 → Windows → 異常設置

並完全檢查標記為“ Common Language Runtime Exceptions ”的行。 當您再次運行代碼時,您應該會獲得有關空異常發生位置的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM