使用VMDisconnectedException的ViewModel属性是致命的

时间:2013-10-21 14:02:13

标签: visual-studio-2012 windows-8 mono xamarin mvvmcross

编辑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;
    }
}

1 个答案:

答案 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与立即窗口的集成 - 它现在比过去更好,但我之前看到过它的几个问题。

可能检查的一些事情:

  • 以上代码适合您吗?
    • 如果确实如此,那么BaseMessageMessagesTableViewSource类中的内容可能会导致问题?
  • 您可以使用Mvx.Trace("The list is {0}", messagesViewModel.Messages ?? "-null")查看列表吗?你可以在ViewModel属性get中使用跟踪 - 是否被调用?你可以在ViewModel构造函数中使用跟踪吗?
  • 你所有的装配都是针对相同版本的东西构建的吗?你的所有组件都重建了吗? (选中“Build | Configuration Manager”) - 你在VS和Mac上运行的是什么版本的Xamarin.iOS?