C# MvxBind:错误:视图绑定期间引发10.40异常
我试图使用提供的代码创建一个简单的服务,但我不明白为什么绑定时会出现异常 10-19 11:42:09.148 I/mono标准输出(1622):MvxBind:错误:在视图绑定期间引发10.40异常 MVXbindingLayoutingFlator工厂生产线133 我需要一些帮助(请:) 我的消息来源: 数据存储接口: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
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行上放置了一个断点,那么它会告诉您任何有用的信息吗?