gpt4 book ai didi

c# - Caliburn.Micro 在导航 GoBack 上重新绑定(bind) ContentControl

转载 作者:太空狗 更新时间:2023-10-29 17:56:20 25 4
gpt4 key购买 nike

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

这是我的主要虚拟机:

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

base.OnActivate();
}
}

这里我使用conductor是因为我想在ContentControl中加载不同的控件,但是现在我只有这段代码。这是我在主视图中的内容控件:

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

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

问题:

当我在 NewsFeedView 控件中使用 NavigationService.NavigateToViewModel 方法导航到另一个 View ,然后在该 View 中使用 NavigationService.GoBack 时,我我返回到 MainView 并且在 MainViewModel.Activate 被调用的那一刻 ActiveItem 不是 null,而是 ContentControl.Contentnull。我试过为 ContentControl 使用 View.Model 附加属性,但没有成功,如何让它重新绑定(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com