我有一个列表视图,其中有两个子视图。一个是显示视图,另一个是编辑视图。这是我定义列表(父)视图的方式。请注意,我希望两个子用户控件在父控件中占据不同的空间。
<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:
这是两个屏幕截图,分别显示了我需要加载编辑视图和详细视图的位置。
正如您在第二个屏幕截图中看到的那样,详细视图被加载到详细信息区域以及编辑区域(选项卡)中。我不希望详细视图仅出现在详细信息区域中。编辑区仅用于编辑视图。
这是我用来生成屏幕截图的代码。
包含两个视图的主视图
<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,因此我得到了一个空白的详细视图,没有填充任何变量。详细信息视图字段的所有加载都在OnActivate()覆盖上完成。这是我的 GroupDetailViewModel 的定义方式
[Export(typeof(GroupDetailViewModel))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class GroupDetailViewModel : Screen {
...
protected override void OnActivate() {
base.OnActivate();
..
}
所以当然,我缺少一些属性。还是我必须在 GroupDetailViewModel 上调用一些方法来手动加载详细信息?