WPF　データバインディング

#はじめに
WPF学習中のため自分用に記載していきます。
間違い、不足などありましたらコメントをよろしくお願いします。

#●UpdateSourceTrigger プロパティ
Bindingソースの更新タイミングを決定する。

|  値  |  内容  |
| ---- | ---- |
|  UpdateSource  |  メソッドを呼び出すときにのみ、ソースを更新する  |
|  LostFocus (Default)  |  フォーカスが外れたタイミングでソースを更新する |
|  PropertyChanged  |  ターゲットのプロパティが変更されるたびに、ソースを即時更新する  |



```View.xmal
<DockPanel Margin="10" DockPanel.Dock="Bottom">
    <Button Command="{Binding AddCommand}" Content="Add" DockPanel.Dock="Right" IsDefault="True" />
    <TextBox Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" />
</DockPanel>
```
```ViewModel.cs
private string text;
public string Text
{
    get => text;
    set
    {
      if (RaisePropertyChangedIfSet(ref text, value))
      {
         // コマンドが実行可能かどうかが変化したことを通知する
         // TextBoxの値が変更される度、実行される
         AddCommand.RaiseCanExecuteChanged();
      }
   }
}

```

#●ObservableCollection<T>を使用したBinding
ObservaleCollectionはINotifyCollectionChangedインターフェースがデフォルトで実装されているため、追加・削除などの変更操作をデータバインディングのターゲットと同期をとることができる。

```View.xaml
<DockPanel>
    <Button Content="Add" Command="{Binding AddCommand}" DockPanel.Dock="Bottom"/>

    <ListBox ItemsSource="{Binding PersonList}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock>
            <Run Text="{Binding Name}"/>
            <Run Text="{Binding Age}"/>
            <Run Text="{Binding Country}"/>
                </TextBlock>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</DockPanel>
```

```MainWindowViewModel.cs
public class MainWindowViewModel : ViewModel
{
    // Personリスト：ObservableCollection
    public ObservableCollection<Person> PersonList { get; private set; } = new ObservableCollection<Person>();

    // 追加ボタン
    private ViewModelCommand addCommand;
    public ViewModelCommand AddCommand => addCommand ??= new ViewModelCommand(AddPerson);

    // Personの追加
    private void AddPerson()
    {
        PersonList.Add(new Person(){Name="すずき", Age=40, Country="日本" });
    }

    public MainWindowViewModel()
    {
        PersonList.Add(new Person() { Name = "マイク", Age = 20, Country = "アメリカ" });
        PersonList.Add(new Person() { Name = "たなか", Age = 25, Country = "日本" });
        PersonList.Add(new Person() { Name = "リー", Age = 30, Country = "中国" });
    }
}
```
上のソースを実行すると、MainWindowViewModel()で追加している人物がListBoxに表示されている。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/9fdebd73-20c0-1964-da46-19e329288e0d.png">　

追加ボタンを押下すると、AddPerson()が実行され「すずき」がListBoxに追加される。
ObservableCollectionを使用しているので、コレクションの追加、削除などを実行すると画面の表示も更新される。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454547/519db4b0-ca0e-cdf3-6a7f-dc3b1b229af0.png">


***

#・環境
VisualStudio2019
.Net Core3.0
Livet v3.2.1



#・参照
[UpdateSourceTrigger 列挙型]
(https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.data.updatesourcetrigger?view=net-5.0)

[WPF4.5入門 その55 「Binding その1」 かずきのBlog@hatena](https://blog.okazuki.jp/entry/2014/09/15/201110)

[UpdateSourceTrigger 列挙型]
(https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.observablecollection-1?view=net-5.0)

[WPF4.5入門 その56「コレクションのバインディング」 かずきのBlog@hatena](https://blog.okazuki.jp/entry/2014/10/29/220236)