无法创建类型'%0'的实例 - Windows Phone 8.1中的错误

时间:2015-09-14 14:44:03

标签: .net xaml asynchronous windows-phone-8.1 async-await

我想将一些示例数据提供给ViewModel,ViewModel包含要在XAML中绑定的数据。这是代码:

    private NotifyTaskCompletion<ObservableCollection<Auction>> _recentAuctions;

    public NotifyTaskCompletion<ObservableCollection<Auction>> RecentAuctions
    {
        get
        {
            return _recentAuctions;
        }
        set
        {
            _recentAuctions = value;
            NotifyPropertyChanged("RecentAuctions");
        }
    }

    public MainMenuViewModel()
    {
        RecentAuctions = new NotifyTaskCompletion<ObservableCollection<Auction>>(dataService.GetRecentAuctions());
    }

(它使用MDSN article中的NotifyTaskCompletion模式)

GetRecentAuctions方法:

    public async Task<ObservableCollection<Auction>> GetRecentAuctions()
    {
        return new ObservableCollection<Auction>
        {
            new Auction
            {
                Percentage = "69",
                Title = "Szybsza spłata",
                Date = "przed chwilą"
            },
            new Auction
            {
                Percentage = "33",
                Title = "Kolejna pożyczka, tym razem na remont.",
                Date = "1 minutę temu"
            }
        };
    }

到目前为止效果很好 - 这些项目显示在<ListView>中。 当我想测试它是否可以异步工作时,问题就开始了,为此我添加了这个“等待”行:

    public async Task<ObservableCollection<Auction>> GetRecentAuctions()
    {
        await Task.Delay(TimeSpan.FromSeconds(1));
        return new ObservableCollection<Auction>
        {
            ...

我收到以下错误:

  

XXX.exe中发生了'System.NullReferenceException'类型的第一次机会异常   'XXX.exe'(CoreCLR:。):已加载'C:\ windows \ system32 \ System.Runtime.WindowsRuntime.UI.Xaml.NI.DLL'。无法找到或打开PDB文件。   XXX.exe中出现“Windows.UI.Xaml.Markup.XamlParseException”类型的第一次机会异常    WinRT信息:无法创建类型'%0'的实例 [行:16位置:10]

任何人都可以解释这种行为吗?缺少什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

很难说,但对我来说,你试图在ViewModel的构造函数中异步加载数据,问题是VM将在加载数据之前完成创建。如果您引用代码中预期要初始化的任何数据项,则可能会遇到System.NullReferenceException

我建议如果你想异步加载数据,不要在VM构造函数中加载。

您可以使用Behaviors SDK挂钩页面的Loaded事件,然后调用您的VM。