バインディングについての自分なりの解釈
1.ルート(フォームのthis)にDataContextを配置(newで生成)し、共有する
⇒追記:別にルートじゃなくてもいい。
(例)
stackpanel.DataContext = HogeObject;
コードにて、
this.DataContext = _obj;
でセット。
xaml側からは
Text="{Binding Name}"
といった感じで紐付け。
注意点
View編集→Model自動更新 はOKだが、
Model変更→View自動更新 は出来ない事が。
バインディングのモードが原因。
BindingのMode
モード | 説明 |
---|---|
OneWay | ソースからターゲットへの一方通行の同期になります。 |
TwoWay | ソースとターゲットの双方向の同期になります。 |
OneWayToSource | ターゲットからソースへの一方通行の同期になります。 |
OneTime | ソースからターゲットへ初回の一度だけ同期されます。 |
★ソース→コントロール への動機は、ソースとなるオブジェクトがINotifyPropertyChangedを実装(インプリメント)してプロパティの変更通知を実装している必要がある。
(例)
public class Person : INotifyPropertyChanged
ただし、テキストボックスなどの一部のコントロールでは、そこまでしなくてもできるみたい。
https://water2litter.net/gin/?p=1401
・・・と思ったけど、上手く行かん。何でだ。
TextBlock は、双方向バインディングの設定だとか INotifyPropertyChangedの実装とかは不要で、View側に通知される?
(参考サイト)
http://blog.okazuki.jp/entry/2014/09/15/201110
http://blog.okazuki.jp/entry/2016/09/15/214319
正しいと思うけど、エラーが出る(名前空間が認識されないなど)
とりあえずリビルド。それで行ける事がある。
2.Window.Resourcesにて定義
WPFの「データ・バインディング」を理解する
http://www.atmarkit.co.jp/ait/articles/1010/08/news123.html
{Binding X}
{Binding Path=X}
バインディングには2種類ある?
- thisに設置して、共有リソースのように使う
- DataGridに流し込むデータ(ItemsSource="{Binding}")
今さら入門するMVVMに必要な技術要素
http://blog.okazuki.jp/entry/2016/09/15/214319
Xamarin.Formsでは、BindableObjectで定義されたBindingContextプロパティに設定されたオブジェクトがBindingのPathの起点になります。
UWPでは、FrameworkElementで定義されたDataContextプロパティに設定されたオブジェクトがBindingのPathの起点になります。