9

我在 WinRT 应用程序中使用 Caliburn.Micro

这是我的主要虚拟机:

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

问题:

当我使用方法在控件中导航NewsFeedView到另一个视图NavigationService.NavigateToViewModel然后在该视图中使用NavigationService.GoBack时,我将返回到MainView并且在被调用的那一刻MainViewModel.Activate不是ActiveItemnull而是。我试过使用附加属性但没有运气,如何让它重新绑定?ContentControl.ContentnullView.ModelContentControl

编辑: 最后我在 Caliburn 中设置记录器以查看发生了什么,我发现了一个错误 - 当 MainView 在导航后加载时发生此事件:

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 时,就会抛出这个异常。如何解决这个问题?

4

2 回答 2

3

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

例如,您还想在构造函数中实例化一次视图模型,或者OnInitialise

public MainViewModel()
{
    this.ActivateItem(new NewsFeedViewModel());
}
于 2013-05-21T19:01:55.980 回答
1

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

于 2013-05-30T17:32:09.577 回答