我在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中加载不同的控件,但是现在我只有这段代码。这是我在主 View 中的内容控件:
<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" />

当我运行应用程序时,一切正常,调用MainViewModel.Activate并将ActiveItem设置为NewsFeedViewModel,并且ContentControl加载NewsFeedView

问题:

当我使用NewsFeedView方法在NavigationService.NavigateToViewModel控件中导航到另一个 View ,然后在该 View 中使用NavigationService.GoBack时,我将返回MainView,并且当MainViewModel.Activate被称为ActiveItem的那一刻不是null,但是ContentControl.Contentnull。我尝试将View.Model附加属性用于ContentControl,但没有运气,如何使其重新绑定(bind)?

编辑:
最后,我在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时,会抛出此异常。
怎么解决呢?

最佳答案

您应该首先采用 View 模型。换句话说,激活 View 模型的实例,Caliburn.Micro将为您完成 View 的位置和绑定(bind)。

看起来您也想只在构造函数中实例化一次 View 模型,例如OnInitialise:

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

关于c# - Caliburn.Micro在导航GoBack上重新绑定(bind)ContentControl,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16675140/

10-13 02:31