【发布时间】:2012-11-17 09:37:44
【问题描述】:
我有一个列表视图,其中有两个子视图。一个是显示视图,另一个是编辑视图。这是我定义列表(父)视图的方式。请注意,我希望两个子用户控件在父控件中占据不同的空间。
<UserControl x:Class="RelayAnalysis_UI.Views.Relays.RelayListView"
....
<ContentControl x:Name="GroupDetail" Grid.Row="2" />
<TabControl x:Name="Items" Grid.Column="0" Style="{StaticResource TabControlStyle}" Margin="5,0,0,0"/>
</UserControl>
然后在我的视图模型中,我根据用户响应以下列方式激活这些项目
**查看模型**
[Export(typeof(RelayListViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class RelayListViewModel : Conductor<IScreen>.Collection.OneActive, IHandle<Group> {
....
public void Edit() { //Requested Edit
RelayEditViewModel viewModel = TryAndLocateViewModel(SelectedRelay.Group.Rack.Id, SelectedRelay.Group.Id);
ActivateItem(viewModel);
}
....
public void ViewGroupDetail(Relay relay) { //Requested View
GroupDetailViewModel viewModel = container.GetExportedValue<GroupDetailViewModel>();
ActivateItem(viewModel);
}
上面的代码可以工作,但细节视图加载在选项卡空间(用于编辑视图的空间)中。实际上,ActivateItem(viewModel) 确实选择了正确类型的视图来显示,但它被加载到了显示视图的错误位置,即显示视图加载到了屏幕上编辑视图的空间中。当然,我错过了一些明显的东西。
综上所述,我们如何让定义在 Parent UserControl 中的两个 UserControl 在自己的空间中激活?
编辑 - 1:
这里有两个屏幕截图,分别显示了我需要在哪里加载 Edit 和 Detail 视图。
正如您在第二个屏幕截图中看到的那样,详细信息视图被加载到详细信息区域以及编辑区域(选项卡)中。我不希望详细视图仅出现在详细信息区域中。编辑区仅用于编辑视图。
这是我用来生成屏幕截图的代码。
包含两个视图的主视图
<UserControl x:Class="RelayAnalysis_UI.Views.Relays.RelayListView"
<Grid>
....
<ContentControl x:Name="GroupDetail" HorizontalContentAlignment="Left"
cal:View.Context="GroupDetail" cal:View.Model="{Binding ActiveItem}"/>
<TabControl x:Name="Items" Grid.Column="0" Style="{StaticResource TabControlStyle}" Margin="5,0,0,0"
cal:View.Context="RelayEdit" cal:View.Model="{Binding ActiveItem}"/>
</Grid>
</UserControl>
编辑 2: 我想我已经很接近让它工作了。根据您的建议,我修改了 Main(Parent) 容器,如下所示。
<UserControl x:Class="RelayAnalysis_UI.Views.Relays.RelayListView"
<ContentControl x:Name="GroupDetail" HorizontalContentAlignment="Left" />
<TabControl x:Name="Items" Grid.Column="0" Style="{StaticResource TabControlStyle}" Margin="5,0,0,0" />
编辑屏幕和详细信息屏幕现在出现在适当的位置。但是,没有调用 Detail ViewModels OnActivate,所以我得到一个没有填充变量的空白 Detail View。详细信息视图字段的所有加载都在 OnActivate() 覆盖上完成。这是我的 GroupDetailViewModel 的定义方式
[Export(typeof(GroupDetailViewModel))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class GroupDetailViewModel : Screen {
...
protected override void OnActivate() {
base.OnActivate();
..
}
当然,我缺少一些属性。还是我必须在 GroupDetailViewModel 上调用一些方法来手动加载详细信息?
【问题讨论】:
标签: wpf caliburn.micro wpf-4.0 caliburn