【问题标题】:Caliburn.Micro - ShowDialog() how to close the dialog?Caliburn.Micro - ShowDialog() 如何关闭对话框?
【发布时间】:2013-08-16 10:28:59
【问题描述】:

编辑:

新信息,刚刚设法让一个记录器工作(老实说,我不知道 cm 有一个!)我在尝试使用 TryClose() 时收到此消息。

TryClose requires a parent IConductor or a view with a Close method or IsOpen property

我已经被困在这个问题上好几天了,研究结果为零,我之前尝试过发布一个关于这个问题的问题,但没有收到任何答案,所以我认为我的措辞不正确。

我有一个视图和视图模型 ContentView/Model,其中包含以下代码:

内容视图

<MenuItem Header="New Project" x:Name="OpenProject" cal:Message.Attach="[Event Click] = [Action NewProject()]"/>

ContentViewModel

public void NewProject()
    {
        NewProjectViewModel viewModel = new NewProjectViewModel(_projectManager);
        _windowManager.ShowWindow(viewModel);
        //If the result is true, we have a new project, otherwise they cancelled the window.
        if (viewModel.Result)
        {
            Project newP = new Project(0, viewModel.ProjectNo, viewModel.ProjectName, 0, 0);
            _projectManager.Insert(newP);
        }
    }

视图模型 NewProjectViewModel 具有以下内容:

 public void Create()
    {
        this.Result = true;
        TryClose(true);
    }

调用方式与之前在对话框的 OK 按钮上使用 message.attach 相同。

但是问题是 TryClose() 总是无法关闭对话框,并且由于我没有 caliburn.micro 的源代码,我无法在 TryClose() 内部进行调试,但是执行 (GetView() As Window).Close() 也会失败,因为 @987654330 @ 总是返回 null。

我完全不知道如何关闭此对话框,因此非常感谢任何帮助或建议。

编辑: 由于我似乎没有得到任何答案,就像以前的问题一样,我会假设我缺少信息。为了理解这个问题,我认为它可能与使用视图优先方法有关。

NewProjectView 我有以下内容:

             xmlns:cal="http://www.caliburnproject.org"
         cal:Bind.Model="ShippingClient.ViewModels.NewProjectViewModel"

这是用来绑定viewmodel的,而不是通常使用的自动方式,也许这就是GetView()返回null的原因吧?

【问题讨论】:

  • 如果您使用Bind.Model 绑定,它仍应连接所有常用的gubbins - 可能是您调用GetView 太早(通常最好在GetView 之前覆盖OnViewAttached )。在最坏的情况下,只需从 codeplex 站点下载 CM 源代码并将 ref 添加到您的项目中,以便您进行调试。您也可以从 CM 源中复制 WindowManager 代码并将其重命名,然后将您自己的 IWindowManager 提供给 CM - 这样您就可以调试 CM 源的那部分
  • 感谢您的回复,我很确定它不会被调用得太早,因为我确实尝试使用来自stackoverflow.com/questions/10090584/… 中的 nemesv 的代码覆盖 AttachView,但是调试始终显示 ViewAttached 为空。我会给你第二个建议,用相同的代码覆盖默认的 WindowManager,看看我能找到什么。
  • 好的,有了新信息,您似乎遇到了一些绑定问题 - CM 正在寻找视图以尝试调​​用 Close,但找不到它。 Window 的什么实现用于弹出窗口?它只是标准的 WPF 窗口吗?
  • 我正在使用 WPF 用户控件,它与 cm WindowManagers ShowDialog 一起显示,我的理解是它在用户控件周围包裹了一个窗口,但我不想发誓。
  • 想通了 - 只是一个小学生的错误,由于某种原因我以前没有看到!检查我的答案

标签: c# wpf dialog caliburn.micro


【解决方案1】:

你绝对会踢自己:

删除 cal:Bind.Modelcal:View.Model 绑定...

如果您使用 ViewModel-First(即您正在创建一个视图模型并使用 WindowManager 或在导体中显示它),所有将视图模型粘合到视图的绑定内容都由 CM 为您完成。

在这种情况下,您不应使用任何 View-First 绑定。您实际上在做的是新建 VM 的另一个实例并将其绑定到您的视图......所以您在后台有两个视图模型,一个连接良好但不再绑定,一个未连接的实例是绑定到你的视图,但不知道指挥。

只需在您的视图中删除任何与视图模型的绑定,一切都会起作用!

【讨论】:

  • 天哪,这是我自己的一个很大的疏忽!我现在不记得为什么了,但过去我首先使用视图,从那以后我一直在自动驾驶仪上添加那条线!像魅力一样工作,非常感谢!
  • 如果我不能使用 cal:Bind.Model 或 cal:View.Model,你是怎么做到的呢?我遇到了完全相同的问题,如何在不使用 cal:View.Model 的情况下在 ContentControl 中显示我的 viewModel?
  • @joe 您不应该将它们用于视图模型优先场景,您能否针对您的问题提出另一个关于 SO 的问题?
  • @Charleh,明智的想法。我在这里提出了一个问题:stackoverflow.com/questions/37563419/…
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 2011-02-25
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多