2014-10-07 73 views
4

我在WPF应用程序中使用Caliburn.MicroModern-UI。在modern-ui框架(这是一个UserControl)内的“页面”上,我试图使用Conductor来切换当前视图。以下是我到目前为止有:为什么Caliburn.Micro(用于modern-ui)OnActivate在ActivateItem之后没有被调用?

注:命名空间从源代码删除为简洁现代的UI窗口

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

来源为内部

XAML的 “页面” 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不火的。我甚至尝试在导体上的查看模型Test1ViewModel上拨打ConductWith(this),但那不起作用。我正在使用Modern-UI这可能很重要,因为这个相同的东西在不使用Modern-UI的不同项目中工作。哦,当调用ActivateItem时,屏幕上会显示相应的视图(我添加了一些验证视图确实会改变的按钮)。

任何想法,为什么UserControl将在ContentControl显示主叫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; 
    } 
} 

回答

8

我去下载的来源Caliburn.Micro和调试整个事情我应该从一开始就做了。

原来,由于方式Modern-UI处理导航Conductor(除非它是连接到主窗口的主外壳视图)不会被激活。换句话说,它永远不会知道它已被显示,Caliburn的源代码检查是否确保Conductor处于活动状态,然后才允许激活新视图。出于某种原因,视图显示得很好,但View ModelScreen)永远不会被激活或实例化。在我的情况下,它被实例化,因为Modern-UI + Caliburn.Micro视图绑定黑客。

我确实得到它终于工作,所以如果任何人有兴趣,这是如何得到ActivateItemConductor工作在Modern-UI内。

下面的代码行添加到您的导线的构造函数或现代的UI方法的OnNavigatedTo

ScreenExtensions.TryActivate(this); 

这是Caliburn-Micro一部分,将让你的Conductor适当启动项目。如果你正在使用它的OnNavigatedTo里面,你可能要将此行添加到您OnNavigatedFrom方法:

ScreenExtensions.TryDeactivate(this, true); 
+0

我有一个类似的问题。我需要通过从对象引用调用ActivateItem来切换视图。 示例: 让我们假设一个选项卡式界面,其中viewmodel aaa当前处于活动状态,viewmodel ccc处于禁用状态。 以下代码被写入视图模型AAA的方法内: 'ViewModelB BBB =新ViewModelB();'' ccc.ActivateItem(BBB);' 但是,如果我切换回CCC其中BBB不loadedd。我怎样才能克服这个问题? – Rahul 2015-10-30 07:17:26

+0

@Rahul虽然看起来很相似,但我认为你的问题与我原来的问题完全不同。我建议创建一个新问题,以便更好地描述您的问题并提供更深入的代码示例。 – vane 2016-04-01 23:41:54

+0

非常感谢@vane - 并感谢您为我调试 - 您的解决方案绝对是现货,我有同样的问题,因为没有明显的原因我的项目没有激活(OnActivated事件),事实证明,确切地说,父母,导体没有被激活,只要我放置一个衬垫'ScreenExtensions.TryActivate(this);'一切正常(正常情况下)。我不确定是否需要'停用'(就像你提到的那样),因为我不'真的需要这样做。再次感谢人! – NSGaga 2016-07-29 20:45:15

相关问题