首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewModel属性在VMDisconnectedException中是致命的

ViewModel属性在VMDisconnectedException中是致命的
EN

Stack Overflow用户
提问于 2013-10-21 14:02:12
回答 1查看 225关注 0票数 1

编辑2:如果你想找一个类似问题的答案,看看斯图尔特的答案和我对它的评论。

编辑:我实际上得到了一个Mono.Debugger.Soft.VMDisconnectedException。我最近还安装了Windows8.1和Resharper (虽然Resharper现在已经挂起)。

当我在MVVMCross Xamarin iOS应用程序中访问视图模型的一个非常简单的list属性时,程序会失败。它并没有在大多数时候退出:它的表现就像它在运行。模拟器有一个黑屏幕,也不例外。如果我在if (messagesViewModel != null) source.ItemsSource = messagesViewModel.Messages;上断点,然后在“立即”窗口中键入messagesViewModel.Messages,那么一切都会停止,这样我就可以知道它在这一行失败了。如果我“踩过去”,它永远不会移动到下一行。

MvxTableViewSource中切换这段代码时,我也有类似的行为。

代码语言:javascript
复制
public override int RowsInSection(UITableView tableview, int section)
{
    return 1;
}

我的视图模型如下所示:

代码语言:javascript
复制
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()
    {
    }
}

这是我在ViewDIdLoad上的MvxTableViewController:

代码语言:javascript
复制
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();
}

一些初始化代码:

代码语言:javascript
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-21 14:35:20

我怀疑无论错误是什么,它没有出现在您发布的任何代码中。

我刚刚创建了一个简单的ViewModel:

代码语言:javascript
复制
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); }
    }
}

还有一个简单的观点:

代码语言:javascript
复制
[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”)--在VS和Mac中运行的是什么版本的Xamarin.iOS?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19496645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档