WPF画面とやり取りするための最低限の構成

## 概要
WPF画面とやり取りするための最低限の機能を備えた構成をつくる。

## 要点  
### やりたいこと
・画面(MainWindow.xaml)のコントロールに、ビューモデル(ViewModel.cs)のプロパティをバインドし、そのプロパティの変更を通知できる。
・画面(MainWindow.xaml)のコントロールに、ICommand(を継承したクラス=DelegateCommand)を使ってコマンド登録できる。

つまり、データの画面表示ができて、画面操作したときになにかアクションさせることができる最低限の構成のイメージ。

### 変化点
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/352601/ae77dc55-39bf-5b95-3e32-1c50bc7d0227.jpeg)

``` BindingBase.cs
using System.ComponentModel;

namespace WpfApp1
{
    class BindingBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// プロパティが変更されたことを通知する.
        /// </summary>
        /// <param name="propertyName">プロパティ名</param>
        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
```

``` DelegateCommand.cs
using System.Windows.Input;

namespace WpfApp1
{
    public class DelegateCommand : ICommand
    {
        System.Action execute;
        System.Func<bool> canExecute;

        public bool CanExecute(object parameter)
        {
            return canExecute();
        }

        public event System.EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public void Execute(object parameter)
        {
            execute();
        }

        public DelegateCommand(System.Action execute)
        {
            this.execute = execute;
        }

        public DelegateCommand(System.Action execute, System.Func<bool> canExecute)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }
    }
}
```

``` ViewModel.cs
namespace WpfApp1
{
    class ViewModel : BindingBase
    {
        public string VmMyText
        {
            get { return _vmMyText; }
            set { _vmMyText = value; OnPropertyChanged(nameof(VmMyText)); }
        }
        public string _vmMyText = "あいうえお";

        public DelegateCommand VmMyCommand { get; private set; }

        public ViewModel()
        {
            // コマンドの中身 登録
            VmMyCommand = new DelegateCommand(
                () =>
                {
                    VmMyText = "１２３４５";
                },
                () =>
                {
                    // ボタンが押せるかどうかを決める処理(trueが「押せる」)
                    return true;
                });
        }
    }
}
```

``` MainView.xaml
<Window x:Class="WpfApp1.MainWindow"
        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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <!--  Viewで直接指定  -->
        <Button
            Content="{Binding VmMyText}"
            Command="{Binding VmMyCommand}"            
            />
    </Grid>
</Window>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/286a2560-b8af-dd8a-81ab-c10d928d2df1.png)


## コード
https://github.com/tera1707/WPF-/tree/master/012_SaiteiGen

## 備考
勉強中のため、上記で使っている単語とその意味に誤りあるかもしれません。