App.xaml MVVM指示灯中的空参考错误

时间:2019-01-02 15:21:33

标签: c# wpf mvvm inversion-of-control 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>

这是我的ApplicationViewModel继承自ViewModelBase

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)
    {
    }
}

这是实现ViewModelBase的{​​{1}}。

INotifyPropertyChanged

这是我的IoC容器:

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");
        }
    }
}

这是我的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 { } 的默认构造函数。

我可以运行我的应用程序,但是我看到一个空窗口。

我忘了什么吗?

编辑:继续回答以下问题:Page can have only Frame as parent and not Window,我将InitializeComponent的代码更改为:

  

MainWindow上的代码必须是这样的:

     
MainWindow
     

这还将在窗口中显示<!-- Opening Window tag with all attributes --> <Frame Content="{Binding CurrentPage, Mode=TwoWay}" /> <!-- Closing Window tag -->

但是仍然会引发空引用错误。

1 个答案:

答案 0 :(得分:1)

在代码中几乎没有null检查,这就是这种情况。

找到问题的最佳方法是转到Visual Studio工具面板

调试→Windows→例外设置

,然后完全检查标记为“ Common Language Runtime Exceptions”的行。当您再次运行代码时,应该获得有关在哪里发生null异常的更多信息。