【发布时间】: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