個人的にはAutoWireしなければ親のDataContextを引き継ぎますから、どうにでもコントロールできていいと思うのですが(Prism的にはいまいちなんですかね)
あとd:DataContextにデザイン用VMなりVMでデザイン時を判断しデータを入れるようにしておくと気が利くなって思います。
回答の私のコメントを回収しておきます。
VMの条件によってはAutoWire
してもいいと思います。
SetDefaultViewTypeToViewModelTypeResolver
が面倒だったら、本体のViewAViewModel
をカラ継承しておいておくとか?^^;
本体はプラグインのことを知らないが、プラグインは本体のことを知っていていいんですよね?
本体側
xml
1<Window
2 x:Class="BlankCoreApp1.Views.MainWindow"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:ViewModels="clr-namespace:BlankCoreApp1.ViewModels"
6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8 xmlns:prism="http://prismlibrary.com/"
9 Width="525"
10 Height="350"
11 d:DataContext="{d:DesignInstance {x:Type ViewModels:MainWindowViewModel}}"
12 prism:ViewModelLocator.AutoWireViewModel="True"
13 mc:Ignorable="d">
14 <Grid>
15 <GroupBox Header="ViewA">
16 <ContentControl prism:RegionManager.RegionName="ContentRegion" DataContext="{Binding ViewAViewModel}" />
17 </GroupBox>
18 </Grid>
19</Window>
xml
1<UserControl
2 x:Class="BlankCoreApp1.Views.DefaultViewA"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:ViewModels="clr-namespace:BlankCoreApp1.ViewModels"
6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8 d:DataContext="{d:DesignInstance {x:Type ViewModels:ViewAViewModel}, IsDesignTimeCreatable=True}"
9 mc:Ignorable="d">
10 <DockPanel>
11 <TextBlock DockPanel.Dock="Top" Text="BlankCoreApp1.Views.DefaultViewA" />
12 <TextBlock Text="{Binding Message}" />
13 </DockPanel>
14</UserControl>
cs
1using BlankCoreApp1.Views;
2using Prism.Mvvm;
3using Prism.Regions;
4
5namespace BlankCoreApp1.ViewModels
6{
7 public class MainWindowViewModel : BindableBase
8 {
9 // 本題でないので直接newするが好きにDIしてください
10 public ViewAViewModel ViewAViewModel { get; } = new ViewAViewModel();
11
12 public MainWindowViewModel() { }
13
14 public MainWindowViewModel(IRegionManager regionManager)
15 {
16 // CustomViewがなければデフォルトを表示
17 regionManager.RegisterViewWithRegion("ContentRegion", typeof(DefaultViewA));
18 }
19 }
20
21 public class ViewAViewModel : BindableBase
22 {
23 private string _message;
24 public string Message { get => _message; set => SetProperty(ref _message, value); }
25
26 public ViewAViewModel() => Message = $"{GetType().FullName}";
27 }
28}
cs
1using BlankCoreApp1.Views;
2using Prism.Ioc;
3using Prism.Modularity;
4using System.Windows;
5
6namespace BlankCoreApp1
7{
8 public partial class App
9 {
10 protected override Window CreateShell() => Container.Resolve<MainWindow>();
11
12 protected override IModuleCatalog CreateModuleCatalog()
13 {
14 // 指定フォルダからモジュール読み込み
15 return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
16 }
17
18 protected override void RegisterTypes(IContainerRegistry containerRegistry) { }
19 }
20}
プラグイン側
xml
1<UserControl
2 x:Class="CustomViewAModule.Views.ViewA"
3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5 xmlns:ViewModels="clr-namespace:BlankCoreApp1.ViewModels;assembly=BlankCoreApp1"
6 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
7 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
8 d:DataContext="{d:DesignInstance {x:Type ViewModels:ViewAViewModel}, IsDesignTimeCreatable=True}"
9 mc:Ignorable="d">
10 <DockPanel>
11 <TextBlock DockPanel.Dock="Top" Text="CustomViewAModule.Views.ViewA" />
12 <TextBlock Text="{Binding Message}" />
13 </DockPanel>
14</UserControl>
cs
1using CustomViewAModule.Views;
2using Prism.Ioc;
3using Prism.Modularity;
4using Prism.Regions;
5
6namespace CustomViewAModule
7{
8 public class CustomViewAModuleModule : IModule
9 {
10 public void OnInitialized(IContainerProvider containerProvider)
11 {
12 var regionManager = containerProvider.Resolve<IRegionManager>();
13
14 // CustomViewで上書きナビゲート
15 regionManager.RequestNavigate("ContentRegion", "ViewA");
16
17 // こちらが後に呼ばれているのにうまく出なかった
18 //regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA));
19 }
20
21 public void RegisterTypes(IContainerRegistry containerRegistry)
22 => containerRegistry.RegisterForNavigation<ViewA>();
23 }
24}