默认使用“ActivateItem(new Control());”例如,您的控件被加载到名为ActiveItem的ContentControl中。 。如果我的页面上有多个内容控件,我将如何在其中加载控件,同时保留使用能够将控件加载到活动项控件中的默认功能的能力。
例如,我希望将登录控件加载到Login ContentControl中,当用户成功登录时,我希望将新控件加载到ActiveItem ContentControl中。
提前完成。
答案 0 :(得分:6)
如果绑定到UI的ViewModel包含名称与内容控件匹配的属性。如果此属性本身是ViewModel类型并已使用Ioc容器注册,则Content控件视图会自动解析此属性支持的视图。例如
<ContentControl x:Name="LoginStatus"></ContentControl>
如果主ViewModel上有一个属性LoginStatus(LoginStatus属性本身就是一个ViewModel)。内容控件将使用适当的视图正确呈现。
答案 1 :(得分:1)
这是一个古老的问题,但是如果有人遇到相同的问题,这是我的解决方案:
Caliburn.Micro.Conductor<Screen>.Collection.AllActive
继承; Caliburn.Micro.Screen
; ActivateItem(MenuUC)
和DeactivateItem(MenuUC)
。 Caliburn.Micro会自动检测您要使用哪一个。示例XAML查看代码:
<Window x:Class="YourProject.Views.YourView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="YourViewTitle" Width="900" Height="480">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="4*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Menu Side Bar -->
<ContentControl Grid.Row="0" Grid.Column="0" x:Name="MenuUC" />
<!-- Panel -->
<Border Grid.Column="1" Grid.RowSpan="2" BorderThickness="1,0,0,0" BorderBrush="#FF707070" >
<ContentControl x:Name="PanelUC" />
</Border>
</Grid>
</Window>
示例C#ViewModel代码:
class YourViewModel : Conductor<Screen>.Collection.AllActive
{
// Menu Side Bar
private MenuUCViewModel _menuUC;
public MenuUCViewModel MenuUC
{
get { return _menuUC; }
set { _menuUC = value; NotifyOfPropertyChange(() => MenuUC); }
}
// Panel
private Screen _panelUC;
public Screen PanelUC
{
get { return _panelUC; }
set { _panelUC = value; NotifyOfPropertyChange(() => PanelUC); }
}
// Constructor
public YourViewModel()
{
MenuUC = new MenuUCViewModel();
ActivateItem(MenuUC);
PanelUC = new FirstPanelUCViewModel();
ActivateItem(PanelUC);
}
// Some method that changes PanelUC (previously FirstPanelUCViewModel) to SecondPanelUCViewModel
public void ChangePanels()
{
DeactivateItem(PanelUC);
PanelUC = new SecondPanelUCViewModel();
ActivateItem(PanelUC);
}
}
在上面的示例中,ChangePanels()
用作将新的用户控件加载到ContentControl中的方法。
也请阅读this question,这可能对您有进一步的帮助。
答案 2 :(得分:0)
你应该看看Screen Conductors。请参阅here。