2つの子ビューがあるリストビューがあります。1つは表示ビューで、もう1つは編集ビューです。これが私がリスト(親)ビューを定義した方法です。2つの子UserControlが親の異なるスペースを占めるようにしたいことに注意してください。
<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)は表示する正しいタイプのビューを選択しますが、表示ビューの間違った場所にロードされます。つまり、表示ビューは画面上の編集ビューのスペースにロードされます。確かに私はいくつかの明白なものを逃しています。
要約すると、親UserControlで定義された2つのUserControlを取得して、独自のスペースでアクティブ化するにはどうすればよいですか?
編集-1:
これは、編集ビューと詳細ビューをそれぞれロードする必要がある場所を示す2つのスクリーンショットです。
2番目のスクリーンショットでわかるように、詳細ビューは詳細領域と編集領域(タブ)に読み込まれます。詳細ビューだけを詳細領域に表示したくありません。編集領域は編集ビュー専用です。
これが、スクリーンショットを生成するために使用したコードです。
両方のビューを収容するメインビュー
<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のメソッドを呼び出す必要がありますか?