はじめに
この記事は筆者のブログ記事 FAC製作記 その4 MVVMフレームワークをPrismからCommunityToolkit.Mvvmに移行する のソースコードを掲載するためのものです。
ブログ記事も合わせてご覧いただけると幸いです。
環境
OS : Windows 10 Home
.NET : Prismは5、ComunityToolkit.Mvvmは6
Prism.Unityを使用したとき
Visual StudioのPrismテンプレートは使用していません。
こちらのページを参考にしたと記憶しています。
App.xaml
<prism:PrismApplication x:Class="FurAffinityClassifier.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:local="clr-namespace:FurAffinityClassifier">
<Application.Resources>
</Application.Resources>
</prism:PrismApplication>
App.xaml.cs
namespace FurAffinityClassifier
{
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// DIの設定
containerRegistry.Register<IAppModel, AppModel>();
containerRegistry.Register<ISettingsModel, SettingsModel>();
containerRegistry.Register<IClassificationModel, ClassificationModel>();
containerRegistry.Register<IDialogHelper, DialogHelper>();
}
}
}
MainWindow.xaml
<Window x:Class="FurAffinityClassifier.Views.MainWindow"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<!--以下略-->
</Window>
MainWindowViewModel.cs
namespace FurAffinityClassifier.ViewModels
{
/// <summary>
/// メイン画面のViewModel
/// </summary>
public class MainWindowViewModel : BindableBase, IDisposable
{
// (以下略)
}
}
CommunityToolkit.Mvvmを使用したとき
こちらのページを参考にしました。
App.xaml
<Application x:Class="FurAffinityClassifier.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:FurAffinityClassifier"
xmlns:vm="clr-namespace:FurAffinityClassifier.ViewModels"
StartupUri="Views/MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<local:Locator x:Key="Locator" />
</ResourceDictionary>
</Application.Resources>
</Application>
App.xaml.cs
using System.Windows;
namespace FurAffinityClassifier
{
public partial class App : Application
{
}
}
Locator.cs
using System;
using FurAffinityClassifier.Helpers;
using FurAffinityClassifier.Models;
using FurAffinityClassifier.ViewModels;
using Microsoft.Extensions.DependencyInjection;
namespace FurAffinityClassifier
{
public class Locator
{
private readonly IServiceProvider serviceProvider;
public Locator()
{
// DIの設定
ServiceCollection services = new();
services.AddTransient<MainWindowViewModel>();
services.AddTransient<ClassifyAsSettingWindowViewModel>();
services.AddTransient<IMainWindowModel, MainWindowModel>();
services.AddTransient<IClassifyAsSettingWindowModel, ClassifyAsSettingWindowModel>();
services.AddSingleton<ISettingsModel, SettingsModel>();
services.AddTransient<IClassificationModel, ClassificationModel>();
services.AddTransient<IDialogHelper, DialogHelper>();
serviceProvider = services.BuildServiceProvider();
}
public MainWindowViewModel MainWindowViewModel => serviceProvider.GetRequiredService<MainWindowViewModel>();
public ClassifyAsSettingWindowViewModel ClassifyAsSettingWindowViewModel => serviceProvider.GetRequiredService<ClassifyAsSettingWindowViewModel>();
}
}
MainWindow.xaml
<Window x:Class="FurAffinityClassifier.Views.MainWindow"
DataContext="{Binding Source={StaticResource Locator}, Path=MainWindowViewModel}">
<!--以下略-->
</Window>
MainWindowViewModel.cs
namespace FurAffinityClassifier.ViewModels
{
/// <summary>
/// メイン画面のViewModel
/// </summary>
public class MainWindowViewModel : ObservableObject, IDisposable
{
// (以下略)
}
}