【问题标题】:Custom view presenter in WPF applicationWPF 应用程序中的自定义视图演示者
【发布时间】:2018-08-01 21:53:13
【问题描述】:

我正在使用 MvvmCross 编写 WPF 应用程序。我想要一个自定义视图演示者。这是我写的:

public class ViewPresenter : MvxWpfViewPresenter
{
    ContentControl _contentControl;

    FrameworkElement _currentContentView;
    FrameworkElement _rootContentView;

    public ViewPresenter(ContentControl c)
    {
        _contentControl = c;

        AddPresentationHintHandler<SetRootHint>(SetRootHintHandler);
        AddPresentationHintHandler<PopToRootHint>(PopToRootHintHandler);
    }

    protected override void ShowContentView(FrameworkElement element, MvxContentPresentationAttribute attribute, MvxViewModelRequest request)
    {
        base.ShowContentView(element, attribute, request);

        _currentContentView = element;
    }

    private bool SetRootHintHandler(SetRootHint hint)
    {
        _rootContentView = _currentContentView;

        return true;
    }

    private bool PopToRootHintHandler(PopToRootHint hint)
    {

        return true;
    }
}

我正在我的Setup 类中注册它:

public class Setup : MvxWpfSetup<Core.App>
{
    protected override IMvxWpfViewPresenter CreateViewPresenter(ContentControl root)
    {
        return new ViewPresenter(root);
    }
}

一旦我尝试显示我的第一个视图,它就会在这一行崩溃:

base.ShowContentView(element, attribute, request);

带有消息:

System.InvalidOperationException: '序列不包含元素'

如果我不覆盖ShowContentView,它仍然会崩溃。如果我不打电话给base.ShowContentView(element, attribute, request),它就不会显示我的视图。

编辑

在我的 Visual Studio 环境中启用Common Language Runtime Exceptions 后,我可以看到异常实际上来自mscorlib.dll,并要求AsyncMethodBuilder.cs 在引发异常时查看调用堆栈帧的源。我所有的 nuget 包都是最新的,并且在 Windows 10 上运行。我相信 WPF 自 Windows 10 起已被弃用。我的 WPF 项目面向 .NET 4.7.2,而我的核心项目面向 .NET Standard 2.0。但我仍然不知道如何解决这个问题。我也在使用最新的 MvvmCross (6.1.2.0)。

编辑 2

我在这里做了一个同样问题的小示例应用程序:

https://drive.google.com/file/d/1uROc8TYzWdx54BV8LtgCNLtwhc_MhXq3/view?usp=sharing

【问题讨论】:

  • 您使用的是哪个版本的 MvvmCross?如果它是最新的(6.1.2),我建议尝试打开源链接,它可以让您调试 mvvm 跨源,并可能让您更好地理解问题。查看Nick's post 的相关信息。如果您仍然无法弄清楚,请从您收到的异常中添加一些堆栈跟踪
  • 谢谢。我编辑了我的帖子。
  • 抱歉,您需要提供更多信息(可能是堆栈跟踪)以了解实际发生的情况以确定可能是什么问题。不过,WPF 绝对没有在 Windows 10 上被弃用。也许还可以查看 MvvmCross github 存储库中的 WPF playground 示例,以检查您可能缺少的内容。其他建议是创建一个简单的 github repro 示例,以便我查看
  • 我制作了一个具有相同问题的小示例应用程序,并将其链接放在原始帖子中。感谢您的帮助!
  • 您的示例应用程序不再可用。你能和我分享一下吗?我正在尝试开始使用 MVVM Cross,但很难找出它是如何在琐碎的东西之上结合在一起的。

标签: mvvmcross


【解决方案1】:

感谢您的样品。我能弄明白。

您遇到此问题是因为您没有在 ViewPresenter 上调用 base 构造函数。将您的 ViewPresenter 代码更改为:

public ViewPresenter(ContentControl c) : base(c)
{
    _contentControl = c;

    AddPresentationHintHandler<SetRootHint>(SetRootHintHandler);
    AddPresentationHintHandler<PopToRootHint>(PopToRootHintHandler);
}

这样,base constructor 将被调用,ContentControl 将被添加到 _frameworkElementsDictionary,而这又不会抛出异常

序列不包含任何元素

因为里面只有一个元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2015-07-23
    • 2013-03-16
    • 2011-08-18
    • 2013-04-23
    相关资源
    最近更新 更多