编辑2 :如果您正在寻找类似问题的答案,请查看Stuart的答案以及我对此的评论。
编辑:我实际上是Mono.Debugger.Soft.VMDisconnectedException
。我最近也安装了Windows 8.1和Resharper(虽然现在暂停了Resharper)。
当我在MVVMCross Xamarin iOS应用程序中访问我的视图模型的一个非常简单的列表属性时,该程序失败。它大部分时间都不会退出:它就像它正在运行一样。模拟器有黑屏,没有例外。如果我在if (messagesViewModel != null) source.ItemsSource = messagesViewModel.Messages;
上断点然后在立即窗口中键入messagesViewModel.Messages
,一切都会停止,所以我可以告诉它在这一行失败了。相反,如果我“跨过”,它永远不会移动到下一行。
当我在MvxTableViewSource
:
public override int RowsInSection(UITableView tableview, int section)
{
return 1;
}
我的视图模型如下所示:
public class MessagesViewModel : MvxViewModel
{
private List<BaseMessage> _messages = null;
public List<BaseMessage> Messages
{
get
{
return _messages; //yes, I know I'm returning null
//I wasn't at first.
}
}
public MessagesViewModel()
{
}
}
这是我在MvxTableViewController上的ViewDIdLoad:
public override void ViewDidLoad()
{
base.ViewDidLoad();
var source = new MessagesTableViewSource(TableView);
//was binding here, removed it for debug purposes
//failure on second line here
var messagesViewModel = ViewModel as MessagesViewModel;
if (messagesViewModel != null) source.ItemsSource = messagesViewModel.Messages;
TableView.Source = source;
TableView.ReloadData();
}
一些初始化代码:
public class App : MvxApplication
{
public App()
{
var appStart = new MvxAppStart<MessagesViewModel>();
Mvx.RegisterSingleton<IMvxAppStart>(appStart);
}
}
public partial class AppDelegate : MvxApplicationDelegate
{
//empty functions removed.
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Window = new UIWindow(UIScreen.MainScreen.Bounds);
var presenter = new MvxTouchViewPresenter(this, Window);
var setup = new Setup(this, presenter);
setup.Initialize();
var startup = Mvx.Resolve<IMvxAppStart>();
startup.Start();
Window.MakeKeyAndVisible();
return true;
}
}
答案 0 :(得分:1)
我怀疑无论错误是什么,它都不在您发布的任何代码中。
我刚刚创建了一个简单的ViewModel:
public class FirstViewModel
: MvxViewModel
{
private List<string> _items = new List<string>() { "One", "Two", "Three"};
public List<string> Items
{
get { return _items; }
set { _items = value; RaisePropertyChanged(() => Items); }
}
}
一个简单的观点:
[Register("FirstView")]
public class FirstView : MvxTableViewController
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
// ios7 layout
if (RespondsToSelector(new Selector("edgesForExtendedLayout")))
EdgesForExtendedLayout = UIRectEdge.None;
var firstViewModel = ViewModel as FirstViewModel;
var source = new MessagesTableViewSource(TableView);
source.ItemsSource = firstViewModel.Items;
TableView.Source = source;
}
public class MessagesTableViewSource : MvxTableViewSource
{
public MessagesTableViewSource(UITableView tableView) : base(tableView)
{
tableView.RegisterClassForCellReuse(typeof(MessagesCell), new NSString("MessagesCell"));
}
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
{
return tableView.DequeueReusableCell("MessagesCell");
}
}
public class MessagesCell : MvxTableViewCell
{
public MessagesCell(IntPtr handle)
: base(handle)
{
var txt = new UILabel(new RectangleF(0, 0, 320, 44));
Add(txt);
this.DelayBind(() =>
{
this.CreateBinding(txt).Apply();
});
}
}
}
这段代码运行良好......
我不完全相信Xamarin.iOS与立即窗口的集成 - 它现在比过去更好,但我之前看到过它的几个问题。
可能检查的一些事情:
BaseMessage
和MessagesTableViewSource
类中的内容可能会导致问题?Mvx.Trace("The list is {0}", messagesViewModel.Messages ?? "-null")
查看列表吗?你可以在ViewModel属性get
中使用跟踪 - 是否被调用?你可以在ViewModel构造函数中使用跟踪吗?