FAC製作記 その4 MVVMフレームワークをPrismからCommunityToolkit.Mvvmに変更する

# はじめに
この記事は筆者のブログ記事 [FAC製作記 その4 MVVMフレームワークをPrismからCommunityToolkit.Mvvmに移行する](https://nikothewolfox.blogspot.com/2022/04/fac-4.html) のソースコードを掲載するためのものです。
ブログ記事も合わせてご覧いただけると幸いです。

# 環境
OS : Windows 10 Home
.NET : Prismは5、ComunityToolkit.Mvvmは6

# Prism.Unityを使用したとき
Visual StudioのPrismテンプレートは使用していません。
[こちら](https://qiita.com/hiki_neet_p/items/e04b5ac692aa18df0968)のページを参考にしたと記憶しています。
```xml: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>
```
```csharp: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>();
        }
    }
}
```
```xml:MainWindow.xaml
<Window x:Class="FurAffinityClassifier.Views.MainWindow"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True">
<!--以下略-->
</Window>
```
```csharp:MainWindowViewModel.cs
namespace FurAffinityClassifier.ViewModels
{
    /// <summary>
    /// メイン画面のViewModel
    /// </summary>
    public class MainWindowViewModel : BindableBase, IDisposable
    {
    // (以下略)
    }
}
```
# CommunityToolkit.Mvvmを使用したとき
[こちら](https://zenn.dev/okazuki/articles/migrate-to-windowsappsdk-from-wpf)のページを参考にしました。
```xml: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>
```
```csharp:App.xaml.cs
using System.Windows;

namespace FurAffinityClassifier
{
    public partial class App : Application
    {
    }
}
```
```csharp: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>();
    }
}
```
```xml:MainWindow.xaml
<Window x:Class="FurAffinityClassifier.Views.MainWindow"
        DataContext="{Binding Source={StaticResource Locator}, Path=MainWindowViewModel}">
<!--以下略-->
</Window>
```
```csharp:MainWindowViewModel.cs
namespace FurAffinityClassifier.ViewModels
{
    /// <summary>
    /// メイン画面のViewModel
    /// </summary>
    public class MainWindowViewModel : ObservableObject, IDisposable
    {
    // (以下略)
    }
}
```