2013-05-21 34 views
9

我的WinRT应用程序中使用Caliburn.MicroCaliburn.Micro重新绑定ContentControl中的导航GoBack的

这里是我的主VM:

public class MainViewModel : Conductor<Screen> 
{ 
    protected override void OnActivate() 
    { 
     if (ActiveItem == null) 
     { 
      ActivateItem(
       ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen); 
     } 

     base.OnActivate(); 
    } 
} 

这里我用的导体,因为我想要加载不同的控件ContentControl,但现在我只有这个代码。这里是主视图我的内容控制:

<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" /> 

当我运行的应用程序都做工精细,MainViewModel.Activate被调用和ActiveItem设置为NewsFeedViewModelContentControl负荷NewsFeedView

问题:

当我使用NavigationService.NavigateToViewModel方法NewsFeedView控制到其他视图导航,然后在视图中使用NavigationService.GoBack,我就要回MainView在那一刻,当MainViewModel.Activate被调用ActiveItemnull,但是ContentControl.Contentnull。我已经尝试使用View.Model附加属性ContentControl但没有运气,如何使它重新绑定?

编辑:在卡利 最后我是安装记录仪,看看会发生什么,我发现了一个错误 - 当的MainView navigationg回来后加载此事件存在的:

Attaching ***.Views.MainView to ***.ViewModels.MainViewModel. 
ViewModel bound on ActiveItem. 
Using cached view for ***.ViewModels.NewsFeedViewModel. 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: Unspecified error 
at Windows.UI.Xaml.Controls.ContentControl.put_Content(Object value) 
... some winRT stack 
at Caliburn.Micro.View.SetContentPropertyCore(... 

尽管它不是那么信息我已经使用InteliTrace获取更多信息并得到以下消息:“元素已经是另一个元素的子元素”。我想NewsFeedView存储在某个地方,当时间到了ContentControl这个异常抛出。 如何解决这个问题?

+0

您是否检查过MainViewModel对象是否仍然是以前的相同实例? “元素已经是另一个元素的子元素”听起来像是在导航到一个新的MainViewModel实例,但旧元素仍然挂在NewsFeedViewModel上。你能分享你的引导程序配置吗? – T045T

+0

请分享您的引导程序。这将告诉你有什么可能性。在.net 4.0/wpf场景中解决了这样的问题。 –

+0

@MareInfinitus在WinRT应用程序中没有引导程序,MainViewModel在Caliburn IoC容器中注册为Singleton – Alexander

回答

3

您应该采用视图模型的第一种方法。换句话说,激活视图模型的一个实例,Caliburn.Micro将为您执行视图位置和绑定。

它也像你想在构造例如刚刚实例化视图模型一次,或OnInitialise

public MainViewModel() 
{ 
    this.ActivateItem(new NewsFeedViewModel()); 
} 
+0

感谢您的回答,但我真的不明白“采用视图模型第一种方法”的意思,我使用视图模型在调用'ActivateItem'时以及在视图之间导航时调用'NavigateToViewModel'时,所以我在这里不使用视图第一种方法 – Alexander

+0

是的,但是从上面包含的MainViewModel代码中,您可以在非常迂回的方式。您通过使用ViewModelLocator和视图类型来获取视图模型。首先使用视图模型实例。 – devdigital

+0

好的,理解,但最终这对数据绑定没有影响,仍然从视图返回时,ContentControl是空的,尽管'ActiveItem'不为空,我试过调用'NotifyOfPropertyChange((()=> ActiveItem)但仍然是相同的结果 – Alexander

1

初始化新闻源视图模型只有一次作为@devdigital说,可能是在构造函数,为什么不使用Conductor.Collection.OneActive,因为你在任何时候只有一个活动项目,它用于这种情况,这可以解决你的问题。