我想为2个不同的视图模型重用视图,在我的示例MyEntityEditViewModel
和MyEntityCreateViewModel
中。这个视图基本上只是一个带有Save
按钮的表单,所以很常见的布局。
我创建了两个视图模型以及父视图/视图模型(MyEntitySummaryViewModel
),现在我想使用ContentControl
定义表单视图。
摘要视图:
<ContentControl x:Name="ActiveItem" cal:View.Model="{Binding ActiveItem}" cal:View.Context="MyEntityDetailView" />
MyEntitySummaryViewModel :
public MyEntity SelectedEntity {
get { return _selectedEntity; }
set {
_selectedEntity = value;
NotifyOfPropertyChange();
ActivateItem(new MyEntityEditViewModel(_selectedEntitity));
}
}
public void Create() {
ActivateItem(new MyEntityCreateViewModel(new MyEntity()));
}
我的问题是现在Caliburn试图找到一个' MyEntityEditView
',由于它的视图定位约定,即使我严格定义了ContentControl
的上下文作为自定义视图。有办法解决这个问题吗?还是我做错了什么?
如果我的理解是正确的,你想要2种类型的ViewModel指向同一个视图。如果是这样,只需创建一个基类为您的实体(EntityBaseViewModel)和创建一个视图(EntityBaseView)。
要绑定ContentControl
,设置他的x:Name
,使其名称匹配ViewModel的属性。
的例子:
视图(ShellView):
<ContentControl x:Name="SelectedEntity"/>
视图模型(ShellViewModel):
public EntityBaseViewModel SelectedEntity
{
get
{
return this._selectedEntity;
}
set
{
this._selectedEntity = value;
this.NotifyOfPropertyChange(() => SelectedEntity);
}
}
和Caliburn将找到ViewModel的视图和绑定数据文本如果你创建你的ViewModel/视图沿着命名约定,就像你说的。
有点晚了,但也许这将帮助某人。这个视频对我帮助很大- (Tim Corey, WPF和Caliburn与MVVM)
设置ShellView与一个控件,指向ActiveItem正如你提到的,允许该控件显示任何视图,你告诉它从ShellViewModel代码。我也在这个项目中使用了Fody,所以它照顾了更改通知,所以你不会看到代码中列出的那些。
ShellView——
<Button x:Name="LoadMainPage" />
<Button x:Name="LoadSecondPage" />
<ContentControl x:Name="ActiveItem"/>
ShellViewModel -
public class ShellViewModel : Conductor<object>.Collection.OneActive
{
public MainPageViewModel MainPageVM = new MainPageViewModel();
public SecondPageViewModel SecondPageVM = new SecondPageViewModel();
public ShellViewModel()
{
LoadMainPage(); // auto load main page on startup
}
public void LoadMainPage()
{
ActivateItem(MainPageVM);
}
public void LoadSecondPage()
{
ActivateItem(SecondPageVM);
}
}
当使用ActivateItem时,不是创建ViewModel的新实例,而是重用创建的初始实例。或者,如果您确实希望在每次启动特定视图时创建另一个实例,那么只需使用您已经拥有的ActivateItem。
在你的SecondPageViewModel中的视图,它将占用ContentControl中的空间为ActiveItem -
public class SecondPageViewModel : Screen
SecondPageView。xaml作为用户控件添加(以及任何其他想要创建的子/子视图)-
<UserControl x:Class="MyNamespace.Views.SecondPageView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyNamespace.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
</Grid>
</UserControl>
这将允许你在基视图/视图模型的任何视图之间来回翻转,并显示你在ContentControl框中选择的子视图的内容(无论你想要多少)。