C# MvxBind:错误:视图绑定期间引发10.40异常

C# MvxBind:错误:视图绑定期间引发10.40异常,c#,xamarin.android,mvvmcross,C#,Xamarin.android,Mvvmcross,我试图使用提供的代码创建一个简单的服务,但我不明白为什么绑定时会出现异常 10-19 11:42:09.148 I/mono标准输出(1622):MvxBind:错误:在视图绑定期间引发10.40异常 MVXbindingLayoutingFlator工厂生产线133 我需要一些帮助(请:) 我的消息来源: 数据存储接口: using Core.Models; using System; using System.Collections.Generic; using System.Collect

我试图使用提供的代码创建一个简单的服务,但我不明白为什么绑定时会出现异常

10-19 11:42:09.148 I/mono标准输出(1622):MvxBind:错误:在视图绑定期间引发10.40异常

MVXbindingLayoutingFlator工厂生产线133

我需要一些帮助(请:)

我的消息来源:

数据存储接口:

using Core.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;

namespace Core.Interfaces
{
    public interface IDataStore
    {
        void UpdateFeed(FeedModel feedModel);
        void DeleteFeed(FeedModel feedModel);
        void CreateFeed(FeedModel feedModel);
        FeedModel GetFeed(Uri uri);
        ObservableCollection<FeedModel> Feeds { get; }
    }
}
使用Core.Models;
使用制度;
使用System.Collections.Generic;
使用System.Collections.ObjectModel;
使用System.Linq;
使用系统文本;
名称空间核心接口
{
公共接口IDataStore
{
void UpdateFeed(FeedModel FeedModel);
void DeleteFeed(FeedModel-FeedModel);
void CreateFeed(FeedModel FeedModel);
FeedModel-GetFeed(Uri);
ObservableCollection提要{get;}
}
}
数据存储类:

using System;
using System.Collections.Generic;
using System.Linq;

using Core.Interfaces;
using System.Collections.ObjectModel;
using Cirrious.MvvmCross.Interfaces.ServiceProvider;
using Cirrious.MvvmCross.Interfaces.Platform;
using Cirrious.MvvmCross.Interfaces.Localization;
using Cirrious.MvvmCross.ExtensionMethods;
using Core.Helpers;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.IO;

namespace Core.Models
{
    public class DataStore
        : IDataStore
        , IMvxServiceConsumer<IMvxSimpleFileStoreService>
        , IMvxServiceConsumer<IMvxResourceLoader>
    {
        public DataStore()
        {
            Load();
        }

        public void UpdateFeed(FeedModel feedModel)
        {
            var toUpdate = this.m_feeds.First(feed => feed.Url == feedModel.Url);
            toUpdate.CloneFrom(feedModel);
            Save();
        }

        public void DeleteFeed(FeedModel feedModel)
        {
            this.m_feeds.Remove(this.m_feeds.First(feed => feed.Url == feedModel.Url));
            Save();
        }

        public void CreateFeed(FeedModel feedModel)
        {
            this.m_feeds.Add(feedModel);
            Save();
        }

        public FeedModel GetFeed(Uri uri)
        {
            return this.m_feeds.First(feed => feed.Url == uri);
        }

        private void Load()
        {
            var fileService = this.GetService<IMvxSimpleFileStoreService>();
            if (!fileService.TryReadBinaryFile(LocationDataService.StoreFileName, LoadFrom))
            {
                var resourceLoader = this.GetService<IMvxResourceLoader>();
                resourceLoader.GetResourceStream(LocationDataService.ResourceFileName, (inputStream) => LoadFrom(inputStream));
            }
        }

        private bool LoadFrom(Stream inputStream)
        {
            try
            {
                var loadedData = XDocument.Load(inputStream);
                if (loadedData.Root == null)
                    return false;

                using (var reader = loadedData.Root.CreateReader())
                {
                    var list = (List<FeedModel>)new XmlSerializer(typeof(List<FeedModel>)).Deserialize(reader);
                    this.m_feeds = new ObservableCollection<FeedModel>(list);
                    return true;
                }
            }
            catch
            {
                return false;
            }
        }

        private void Save()
        {
            var fileService = this.GetService<IMvxSimpleFileStoreService>();
            fileService.WriteFile(LocationDataService.StoreFileName, (stream) =>
            {
                var serializer = new XmlSerializer(typeof(List<FeedModel>));
                serializer.Serialize(stream, m_feeds.ToList());
            });
        }

        private ObservableCollection<FeedModel> m_feeds;
        public ObservableCollection<FeedModel> Feeds
        {
            get { return this.m_feeds; }
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用核心接口;
使用System.Collections.ObjectModel;
使用cirries.MvvmCross.Interfaces.ServiceProvider;
使用cirries.MvvmCross.Interfaces.Platform;
使用cirries.MvvmCross.Interfaces.Localization;
使用cirries.MvvmCross.ExtensionMethods;
使用Core.Helpers;
使用System.Xml.Serialization;
使用System.Xml.Linq;
使用System.IO;
名称空间核心模型
{
公共类数据存储
:IDataStore
,IMvxServiceConsumer
,IMvxServiceConsumer
{
公共数据存储()
{
加载();
}
public void UpdateFeed(FeedModel FeedModel)
{
var toUpdate=this.m_feeds.First(feed=>feed.Url==feedModel.Url);
toUpdate.CloneFrom(feedModel);
Save();
}
公共void DeleteFeed(FeedModel FeedModel)
{
Remove(this.m_feeds.First(feed=>feed.Url==feedModel.Url));
Save();
}
public void CreateFeed(FeedModel FeedModel)
{
this.m_feed.Add(feedModel);
Save();
}
公共FeedModel GetFeed(Uri)
{
首先返回这个.m_feed.First(feed=>feed.Url==uri);
}
专用空心荷载()
{
var fileService=this.GetService();
如果(!fileService.TryReadBinaryFile(LocationDataService.StoreFileName,LoadFrom))
{
var resourceLoader=this.GetService();
resourceLoader.GetResourceStream(LocationDataService.ResourceFileName,(inputStream)=>LoadFrom(inputStream));
}
}
私有bool LoadFrom(流输入流)
{
尝试
{
var loadedData=XDocument.Load(inputStream);
if(loadedData.Root==null)
返回false;
使用(var reader=loadedData.Root.CreateReader())
{
var list=(list)新的XmlSerializer(typeof(list))。反序列化(reader);
this.m_feeds=新的可观察集合(列表);
返回true;
}
}
抓住
{
返回false;
}
}
私有void Save()
{
var fileService=this.GetService();
fileService.WriteFile(LocationDataService.StoreFileName,(流)=>
{
var serializer=newxmlserializer(typeof(List));
serializer.Serialize(stream,m_feeds.ToList());
});
}
私有可观察收集m_提要;
公共可观测收集源
{
获取{返回this.m_feeds;}
}
}
}
BaseViewModel:

using Cirrious.MvvmCross.Commands;
using Cirrious.MvvmCross.ExtensionMethods;
using Cirrious.MvvmCross.Interfaces.Commands;
using Cirrious.MvvmCross.Interfaces.ServiceProvider;
using Cirrious.MvvmCross.ViewModels;
using Core.Interfaces;

namespace Core.ViewModels
{
    public class BaseViewModel
        : MvxViewModel
        , IMvxServiceConsumer<IDataStore>
    {
        protected IDataStore DataStore
        {
            get { return this.GetService<IDataStore>(); }
        }
    }
}
using Cirrious.MvvmCross.Commands;
using Cirrious.MvvmCross.Interfaces.Commands;
using Core.Controls;
using Core.Models;
using System;
using System.Collections.ObjectModel;

namespace Core.ViewModels
{
    public class FeedsManagerViewModel
        : BaseViewModel
    {

        public ObservableCollection<FeedModel> Feeds { get { return this.DataStore.Feeds; } }

       ...
    }
}
使用cirries.MvvmCross.Commands;
使用cirries.MvvmCross.ExtensionMethods;
使用cirries.MvvmCross.Interfaces.Commands;
使用cirries.MvvmCross.Interfaces.ServiceProvider;
使用cirries.MvvmCross.ViewModels;
使用核心接口;
namespace Core.ViewModels
{
公共类BaseViewModel
:MvxViewModel
,IMvxServiceConsumer
{
受保护的IDataStore数据存储
{
get{返回此.GetService();}
}
}
}
FeedManager视图模型:

using Cirrious.MvvmCross.Commands;
using Cirrious.MvvmCross.ExtensionMethods;
using Cirrious.MvvmCross.Interfaces.Commands;
using Cirrious.MvvmCross.Interfaces.ServiceProvider;
using Cirrious.MvvmCross.ViewModels;
using Core.Interfaces;

namespace Core.ViewModels
{
    public class BaseViewModel
        : MvxViewModel
        , IMvxServiceConsumer<IDataStore>
    {
        protected IDataStore DataStore
        {
            get { return this.GetService<IDataStore>(); }
        }
    }
}
using Cirrious.MvvmCross.Commands;
using Cirrious.MvvmCross.Interfaces.Commands;
using Core.Controls;
using Core.Models;
using System;
using System.Collections.ObjectModel;

namespace Core.ViewModels
{
    public class FeedsManagerViewModel
        : BaseViewModel
    {

        public ObservableCollection<FeedModel> Feeds { get { return this.DataStore.Feeds; } }

       ...
    }
}
使用cirries.MvvmCross.Commands;
使用cirries.MvvmCross.Interfaces.Commands;
使用核心控制;
使用核心模型;
使用制度;
使用System.Collections.ObjectModel;
namespace Core.ViewModels
{
公共类FeedsManagerViewModel
:BaseViewModel
{
public observeCollection提要{get{返回this.DataStore.Feeds;}
...
}
}
查看xml:

<Mvx.MvxBindableListView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            local:MvxBind="{'ItemsSource':{'Path':'Feeds'}, 'ItemClick':{'Path':'DisplayItemCommand'}}"
            local:MvxItemTemplate="@layout/feedlist_viewmodel" />

这很可能是XML中的错误。。。但仅仅从这一条线索很难分辨

您正在运行哪个版本的MvvmCross

Master和vNext的tip版本将第133行显示为

  MvxBindingTrace.Trace(MvxTraceLevel.Error, "Exception during creation of {0} from type {1} - exception {2}", name, viewType.FullName, exception.ToLongString());
所以,如果你使用这个技巧,希望它能为你提供更多关于问题所在的信息

除此之外,您还可以尝试在有问题的行上设置断点以提取更多信息


如果第99行出现异常,则将错误记录更改为:

MvxBindingTrace.Trace(MvxTraceLevel.Error, "Exception thrown during the view binding ", exception.ToLongString());
致:

错误将出现在那里的某个地方:)


另一个好的调试技巧是逐行注释,直到问题消失——这有助于确定问题所在


你有一个工作的开发环境和一个非常强大的调试器——使用它是一项很好的学习技能《代码完成》是我最喜欢的书之一:)

有什么例外?还有输出跟踪吗?feedlist_viewModel.axml看起来像什么?如果您在该文件的第133行上放置了一个断点,那么它会告诉您任何有用的信息吗?