4

我正在使用Caliburn.MicroModern-UIWPF应用程序中。在 modern-ui 框架(即 a UserControl)内的“页面”上,我试图使用 aConductor来切换当前视图。这是我到目前为止所得到的:

注意:为简洁起见,从源中删除了命名空间

现代 ui 窗口中“页面”的 XAML

<UserControl x:Class="ShellView">
    <ContentControl x:Name="ActiveItem" />
</UserControl>

ShellViewModel 的来源(指挥者)

[Export]
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
    private readonly Test1ViewModel m_TestView1;
    private readonly Test2ViewModel m_TestView2;

    public ShellViewModel()
    {
        this.m_TestView1 = new Test1ViewModel();
        this.m_TestView2 = new Test2ViewModel();

        this.ActivateItem(this.m_TestView1);
    }
}

Test1View 的 XAML 现在没有任何内容,只是普通的 UserControl 内容。

Test1ViewModel 的来源

public class Test1ViewModel : Screen
{
    protected override void OnActivate()
    {
        //This DOES NOT show or fire, I even put a breakpoint to double check
        Debug.Print("This should show in output");
    }
}

ActivateItem被调用时,OnActivate根本不会触发。我什至尝试调用指挥中ConductWith(this)的视图模型Test1ViewModel,但没有奏效。我正在使用Modern-UI这可能很重要,因为同样的事情在另一个不使用Modern-UI. 哦,当ActivateItem被调用时,屏幕上会显示相应的视图(我添加了一些按钮来验证视图是否发生了变化)。

关于为什么UserControlContentControl在调用后显示ActivateItemOnActivate根本不触发的任何想法?

还有一件事......这也可能与它有关,但如果是这样,我不知道为什么或如何解决它。我正在使用这个类来使视图首先Modern-UICaliburn.Micro模型优先方法一起工作。

internal class ModernContentLoader : DefaultContentLoader
{
    protected override object LoadContent(Uri uri)
    {
        object content = base.LoadContent(uri);
        if (content == null)
            return null;

        // Locate the right viewmodel for this view
        object vm = ViewModelLocator.LocateForView(content);
        if (vm == null)
            return content;

        // Bind it up with CM magic
        if (content is DependencyObject)
            ViewModelBinder.Bind(vm, content as DependencyObject, null);

        return content;
    }
}
4

1 回答 1

9

我去下载了源代码Caliburn.Micro并调试了整个事情,就像我从一开始就应该做的那样。

事实证明,由于Modern-UI处理导航的方式Conductor(除非它是附加到主窗口的主 shell 视图)没有被激活。换句话说,它永远不知道它正在被显示,并且 Caliburn 的源Conductor会在允许激活新视图之前检查以确保它处于活动状态。由于某种原因,视图显示得很好,但View Model( Screen) 永远不会被激活或实例化。在我的情况下,它是由于Modern-UI+Caliburn.Micro视图绑定黑客而被实例化的。

我确实让它终于工作了,所以如果有人有兴趣,这就是如何在ActivateItem里面Conductor工作Modern-UI

将以下代码行添加到 Conductor 的构造函数或 Modern-UI 方法 OnNavigatedTo

ScreenExtensions.TryActivate(this);

这是其中的一部分,Caliburn-Micro将允许您Conductor正确激活项目。如果您在内部使用它,OnNavigatedTo您可能希望将此行添加到您的OnNavigatedFrom方法中:

ScreenExtensions.TryDeactivate(this, true);
于 2014-10-08T15:39:11.570 回答