【C#】【WPF】令和の今、MVVMならCaliburn.Microが良いです(^^♪

##MVVM開発について考えました(^^♪

<B>Livet</B>開発終了です。

<B>MVVM Light</B>、DialogMessage提供終了です。

<B>Prism</B>、プレーンすぎて、作らなければいけないことが多すぎです。

そして、<B>令和</B>の今、<B>MVVM</B>なら<B>Caliburn.Micro</B>が良いです!(^^)!

###では、さっそく、サンプルを作ってみましょう(^^♪

###（１）新しいプロジェクトを作成します。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/6e76df3d-0ac7-d6d1-32a4-f6f5bdc7abcc.jpeg)
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/e3bc8e0b-df29-69b8-f052-142900f4736d.jpeg)
###（２）NuGetパッケージの管理で、Caliburn.Micro.Startをインストールする。
![30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/245343de-9dc4-84f2-a30d-1fce77a852e4.jpeg)
![40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/69bcea7d-8607-ac2e-7e53-f97577134e61.jpeg)

###（３）App.xamlを書き換える。
```Xml:App.xaml
<Application x:Class="CMSample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:CMSample"
             >
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <local:AppBootstrapper x:Key="bootstrapper" />
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>
```
###（４）ビルドして、実行する。はい、動きました(^^♪
![70.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/6050fa90-ca78-e675-3fd3-60866f4d9693.jpeg)
###（５）今度は、より実践的にしてみましょう。
<B>Views</B>、<B>ViewModels</B>、<B>Models</B>の３つのフォルダを作ります。
そして、IShell.cs、ShellViewModel.csを、ViewModelsフォルダにドラッグ＆ドロップします。
そして、ShellView.xamlを、Viewsフォルダにドラッグ＆ドロップします。
![100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/c6ef4b2a-759e-ef7b-4570-a0a874c01629.jpeg)
###（６）ビルドして、実行する。はい、動きました。
![110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/2b99e363-639e-4e03-c300-ced4310e067e.jpeg)
###（７）それでは、いよいよ本番です!(^^)!
###（８）ViewsフォルダのShellView.xamlの削除
![140.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/c322fa3e-b31f-5af5-aa52-e73df130960f.jpeg)

###（９）プロジェクトに、ShellView.xamlを作成する。
![150.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/7e701998-bebd-6667-9822-2f263b221daa.jpeg)
![160.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/aab193c9-5cee-4fa5-4e27-aaee4e98fa4f.jpeg)
![170.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/2fa5f666-2935-ccd7-3810-2dfaba91544f.jpeg)

###（１０）プロジェクトのShellView.xamlを、Viewsフォルダにドラッグ＆ドロップする。
![100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/02e6c166-2cf0-e95a-0de5-00e0c67eceec.jpeg)
###（１１）IShell.csを書き換えます。
```cs:IShell.cs
namespace CMSample {
    public interface IShell
    {
        //名前、プロパティ
        string P_s_名前 { get; set; }

        //名前があるか、プロパティ
        bool P_b_名前があるか { get; }

        //名前を言え、メソッド
        void 名前を言え();
    }
}
```
###（１２）ShellViewModel.csを書き換えます。
```cs:ShellViewModel.cs
using System.Windows;

namespace CMSample {
    public class ShellViewModel : Caliburn.Micro.PropertyChangedBase, IShell
    {
        //名前、プロパティ
        private string m_s_名前;
        public string P_s_名前
        {
            get => m_s_名前;

            set
            {
                m_s_名前 = value;
                NotifyOfPropertyChange(() => P_s_名前);
            }
        }

        //名前があるか、プロパティ
        public bool P_b_名前があるか => !string.IsNullOrWhiteSpace(P_s_名前);

        //名前を言え、メソッド
        public void 名前を言え()
        {
            if (P_b_名前があるか)
                MessageBox.Show($"こんにちは、{P_s_名前}さん");
            else
                MessageBox.Show($"名前を入力してください", "お願い",
                    MessageBoxButton.OK, MessageBoxImage.Exclamation);
        }

    }
}
```
###（１３）ShellView.xamlを書き換えます。
```Xml:ShellView.xaml
<Window x:Class="CMSample.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CMSample"
        mc:Ignorable="d"
        xmlns:cm ="http://www.caliburnproject.org"
        Width="300" Height="180"
        Title="CMサンプル">
    <Grid>
        <StackPanel Margin="10">

            <Label Content="お名前を入力してください"/>

            <TextBox
                Margin="11,0"
                Text="{Binding P_s_名前, UpdateSourceTrigger=PropertyChanged}"/>

            <Button
                Margin="11,10,11,0"
                IsDefault ="true"
                Content="返答"
                cm:Message.Attach="名前を言え"/>

        </StackPanel>
    </Grid>
</Window>
```
###（１４）ビルドして、実行します。
![200.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/2cb2ef3e-ae81-30ff-c730-88a9f9f58bb4.jpeg)
###（１５）名前を入れないで、返答ボタンを押します。怒られます。
![220.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/e5841709-497a-4287-eca0-1eaf79458157.jpeg)
###（１６）名前を入れて、返答ボタンを押します。
![210.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575679/af989492-bb83-e39c-83aa-899bf99100b5.jpeg)
###（１７）最後に、お掃除します。
MainWindow.xamlと、ShellView.xaml.csと、App.xaml.csを、必要がなくなったので、削除します。
###サンプルの作成は、以上です。
##読んでくださって、ありがとうございました(^^)/