我有一个列表框来选择要编辑的项目。我也有一个编辑按钮。将其称为MainView [Model]。
如果按下编辑按钮,MainView [Model]将被EditView [Model]替换。 EditView不会显示在MainView下方或旁边的区域中。它应该被完全替换或至少完全隐藏MainView。
如果编辑完成(OK,取消),MainView将再次显示。
我试图覆盖ContentControl但没有成功。 现在,我正在考虑一种NavigatorViewModel,它有一个属性公开的多个ViewModel。但我不确定这是否是正确的方向。
有人可以帮忙吗?
THX。
答案 0 :(得分:0)
您最好使用Caliburn.Micro提供的导体图案。导体管理一个或多个屏幕并控制它们的寿命。有关详细信息,请参阅Screens, Conductors and Composition。
首先,我们需要一个shell。这是你的&#34; NavigatorViewModel&#34;。它源自Conductor<Screen>.Collection.OneActive
,这意味着它包含一个屏幕列表,其中一个屏幕可以一次处于活动状态:
public interface IShell
{
void ActivateItem(Screen screen);
}
public class ShellViewModel : Conductor<Screen>.Collection.OneActive, IShell
{
public ShellViewModel()
{
this.ActivateItem(new MainViewModel());
}
}
指挥有一个ActiveItem
属性,我们想要ContentControl
绑定它,所以我们看到相应的视图:
<!-- ShellView.xaml -->
<Window x:Class="WpfApplication1.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ContentControl Name="ActiveItem" />
</Window>
我们的MainViewModel
可以使用其父级shell导航到EditViewModel
:
public class MainViewModel : Screen
{
public void Edit()
{
((IShell)this.Parent).ActivateItem(new EditViewModel());
}
}
我们将按钮绑定到Edit
方法:
<!-- MainView.xaml -->
<UserControl x:Class="WpfApplication1.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button Name="Edit" Content="Edit" />
</UserControl>
EditViewModel
也派生自Screen,只包含您的编辑逻辑:
public class EditViewModel : Screen
{
}
最后,我们将一个按钮绑定到TryClose
方法,因此视图模型会自行关闭并从shell的项目中删除。最后激活的项目(MainViewModel
)将被重新激活:
<!-- EditView.xaml -->
<UserControl x:Class="WpfApplication1.EditView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button Name="TryClose" Content="Back" />
</UserControl>
关于它。