WPF超絶入門から学び直し3【データ・バインディングの概要】

簡単なバインディングはできても少し複雑になるとすぐ上手くいかなくなってしまう。
自分はデータ・バインディングのことを何も知らないまま突き進もうとしている…。
そこで、データ・バインディングとは何者なのか、見つめ直してみることにします。

本記事では、詳細を見る前に、データ・バインディングの大まかな概要だけをまとめることにします。

# <font color=#ff1493>1. データ・バインディングとは</font>
[参考：Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)
- データ・バインディングとは、何らかのデータを別の箇所に反映させる仕組みのこと。
- バインディングするときには、反映元である「**ソース**」と反映先である「**ターゲット**」の二者が存在する。
- .NETやXAMLに限った用語ではない。
- MVVMパターンの実現に必要不可欠な仕組み。

# <font color=#ff1493>2. バインディングのソースとターゲットとは</font>
[参考：@IT](https://atmarkit.itmedia.co.jp/ait/articles/1010/08/news123.html)

「どれがソースで、どれがターゲット？」を常に意識することによって、バインディングへの理解が深まり自信をもって実装できるようになっていくと思う。

### :ribbon: <font color=#ff1493>バインディング・ソース</font>
反映元のデータを格納するプロパティを保持するオブジェクトのこと。

>**<font color=black>■ ソースになれるもの</font>**
> - <font color=black>CLRオブジェクトのpublicプロパティ</font>
> - <font color=black>依存関係オブジェクトの依存関係プロパティ</font>
> - XMLオブジェクト(割愛)
> - 動的オブジェクト(割愛)

### :ribbon: <font color=#ff1493>バインディング・ターゲット</font>
データの反映先となるプロパティを保持するオブジェクトのこと。

>**<font color=black>■ ターゲットになれるもの</font>**
> - <font color=black>依存関係オブジェクトの依存関係プロパティ</font>

<br><br>
<details><summary><font color =#ff66b8 ><b>補足1：「CLRオブジェクトのプロパティ」とは</b></font></summary>
CLRとは「[共通言語ランタイム](CLR（共通言語ランタイム）を搭載し、入力された言語をCIL（共通中間言語）に変換・実行することが可能です。)」の略ですが、XAMLの話をするときは、.csファイルに書いたC#コードのことを、XAMLと区別して指すときに使われがちな言葉のように思います。

よって一例は、普通のC#クラスに書いた普通のプロパティです。

MVVMパターンに則した開発なら、バインディング・ソースとしてViewModelクラスのプロパティを使う方法が最頻出だと思います。

```csharp:CLRオブジェクトのプロパティの例
public string MyText {get; set;}

```

<font color="#ff99cf">((余談…開発の便宜上、XAMLとCLRは対義語のように語られたりしますが、WPFではXAMLはC#で書くと分かりにくいコードを分かりやすく書くために使われていて、C#などの.NETプログラミング言語に対応付けがされているので、C#などと同様に最終的にはCLRオブジェクトを生成する。つまりXAMLとCLRは実際には対立する存在ではない。))</font>
</details>



<details><summary><font color =#ff66b8 ><b>補足2：「依存関係オブジェクト」とは</b></font></summary>
Window や、そこに配置する Button、TextBox など部品のクラスは、DependencyObject というクラスを継承しています。このようなクラスから生成されるオブジェクトを依存関係オブジェクトと言います。DependencyObjectクラスを継承することで、「依存関係プロパティ」という特別なプロパティを定義できるようになります。

</details>

<details><summary><font color =#ff66b8 ><b>補足3：「依存関係プロパティ」とは</b></font></summary>
とてもおおざっぱに言うと、XAMLで書ける要素に好きな値を指定できるプロパティのことです。
例えば、「Hello.」と書かれたテキストボックスを作りたいとき、XAMLでTextBox要素のTextプロパティに「Hello.」という文字列を指定しますよね。このTextプロパティが、TextBoxが持つ依存関係プロパティの1つです。

```XML:TextBoxの依存関係プロパティText
<TextBox Text="Hello."/>
```
</details>

# <font color=#ff1493>3. Bindingマークアップ拡張とは</font>

[参考1：izumi様の記事(Qiita)](https://qiita.com/izumi_0x01/items/8066f7263a3324764716)
[参考2：.NETな日々 -EX-](https://kazutoex.hatenadiary.org/entry/20100427/1272373197)

- **XAMLマークアップ拡張**
XAMLで`{}`(波括弧)で囲んで書く記述のこと。
- **Bindingマークアップ拡張**
XAMLマークアップ拡張のうち、データ・バインディングに関する記述のこと。

マークアップ拡張は、データ・バインディングでは日常的に使うので避けて通れない道です。

入門者の我々が「バインディングがうまくいかない！」という時は、ViewModel側で通知を忘れているか、そうでなければBindingマークアップ拡張を理解できていないために正しくバインディングができていないからです。

Bindingマークアップ拡張では、単純にバインディング・ソースを指定するだけの記述から、バインディングの細かい挙動設定まで様々に指定できるようになっています。

```XML:単純にバインディング・ソースだけを指定する例
<TextBox Text="{Binding MyText}"/>
```
```XML:バインディング・ソースとともにバインディングモードも指定する例
<TextBox Text="{Binding Path=MyText, Mode=TwoWay}"/>
```

実はこれはBindingというクラスのオブジェクトを生成して、PathやらModeやらとかいうプロパティに値を設定しているだけなのです。

というわけで、バインディングのもうちょっと詳細な裏側は次回以降の記事に書きたいと思って、、おるよ(^ω^)