在Caliburn中找不到ViewModel(IWindowManager.ShowDialog)的视图

时间:2012-07-26 14:28:15

标签: wpf c#-4.0 mvvm caliburn.micro

问题是,当我使用windowManager.showDialog()函数的第三个参数时,这是设置,我收到的错误消息是找不到我的ViewModel的视图。

var view = Caliburn.Micro.ViewLocator.LocateForModel(MyViewModel, null, null);
dynamic settings = new System.Dynamic.ExpandoObject();
settings.ShowInTaskbar = false;
Caliburn.Micro.ViewModelBinder.Bind(MyViewModel, view, null);
this.windowManager.ShowDialog(MyViewModel, "", settings);

看起来提供设置,View已不复存在。但是当我删除最后两个参数时,事情工作文件。我试过SO和其他论坛,但找不到答案。

感谢您的支持。 伊尔凡

1 个答案:

答案 0 :(得分:2)

简短回答:尝试在不指定上下文参数的情况下显示对话框 - 通过利用 C#4.0中引入的Optional Arguments将其保留为默认null

this.windowManager.ShowDialog(MyViewModel, settings: settings);

答案很长:方法WindowManager.ShowDialog()的方式如下:

/// <summary>
/// Shows a modal dialog for the specified model.
/// </summary>
/// <param name="rootModel">The root model.</param>
/// <param name="context">The context.</param>
/// <param name="settings">The optional dialog settings.</param>
public virtual void ShowDialog(object rootModel,
                               object context = null,
                               IDictionary<string, object> settings = null)
{
    var view = EnsureWindow(rootModel,
                           ViewLocator.LocateForModel(rootModel, null, context));

    ViewModelBinder.Bind(rootModel, view, context);

    var haveDisplayName = rootModel as IHaveDisplayName;

    if(haveDisplayName != null &&
       !ConventionManager.HasBinding(view, ChildWindow.TitleProperty))
    {
        var binding = new Binding("DisplayName") { Mode = BindingMode.TwoWay };
        view.SetBinding(ChildWindow.TitleProperty, binding);
    }

    ApplySettings(view, settings);

    new WindowConductor(rootModel, view);

    view.Show();
}

请注意,它会调用EnsureWindow()并将 context 参数传递给。{如果您将此参数指定为 string.Empty (或“”),它将在Caliburn实现中进一步处理,然后只需null值来查找相应的View for提供了视图模型。

希望得到这个帮助。

相关问题