Caliburn Micro Conductor + TransitioningContentControl

时间:2012-04-27 18:18:21

标签: c# silverlight caliburn.micro

我遇到问题让我的CM Conductor维持Active与TransitioningContentControl内容的正确绑定。

如果重要,我使用的是Conductor<Screen>.Collection.OneActive

重现问题的步骤

创建一个绑定到导体ActiveItem的TransitioningContentControl:

<toolkit:TransitioningContentControl x:Name="ActiveItem" />

创建两个按钮:

<Button x:Name="Nav1" Content="Test1"></Button>
<Button x:Name="Nav2" Content="Test2"></Button>

在视图模型中,连接Nav1和Nav2单击事件以设置activeitem

public void Nav1()
{
    ActiveItem = _viewModel1;
}

public void Nav2()
{
    ActiveItem = _viewModel2;
}

乍一看,这似乎工作正常 - 但是有问题。假设活动项表示Nav1(_viewModel1)。

如果然后单击Nav2,并在transitioniningContentControl完成转换之前单击Nav1,则即使ActiveItem成功设置回_viewModel1,Nav2的视图仍将显示在屏幕上。

这使您处于ActiveItem为_viewModel1的无效状态,但正在显示的视图绑定了_viewModel2。

想法?直接绑定到ActiveItem有什么问题吗?

编辑:

关闭“Just my code”调试后,我发现在转换过程中设置ActiveItem时会抛出ArgumentException。堆栈跟踪显示:

at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
(lots of junk)
Caliburn.Micro!Caliburn.Micro.View.SetContentPropertyCore(object targetLocation, object view) + 0xec bytes  
Caliburn.Micro!Caliburn.Micro.View.SetContentProperty(object targetLocation, object view) + 0x84 bytes  
Caliburn.Micro!Caliburn.Micro.View.OnModelChanged(System.Windows.DependencyObject targetLocation, System.Windows.DependencyPropertyChangedEventArgs args) + 0xda bytes  

不确定这是否有用。

1 个答案:

答案 0 :(得分:0)

尝试使用Conductors ActivateItem方法来修改ActiveItem属性。

public void Nav1()
{
    ActiveItem(_viewModel1);
}

我希望这会有所帮助

马丁