我在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.Content
是null
。我尝试将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/