29
わわわわわわ わわわわわわ #27 Windows ススス ススススス ススス ススススススススススス ! 2013/5/18 BluewaterSoft biac

わんくま名古屋#27(20130518) データバインディングを極める

Embed Size (px)

Citation preview

Page 1: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

Windows ストア アプリの肝 ~ データ バインディングを極める !

2013/5/18

BluewaterSoft biac

Page 2: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

Windows ストア アプリを作るのに必要なこと

• 昔 Metro と言っていたUI

• Windows Runtime• ガチガチのサンドボック

スへの対処• async / await

• たくさん必要 !その中のひとつで、けっこう難解なのが…

……

データ バインディング

Page 3: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介

Page 4: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • 1957: スプートニク以前に誕生 ( 宇宙世紀未満 )

• 1983: 名古屋大学工学部( 修士 ) 卒

• HONDA R&D で自動車設計• 1994 ~ ソフトウェア業界• 2012 ~

BluewaterSoft

biac ( 山本 康彦 )http://www.bluewatersoft.jp

Page 5: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • 本を書いたり

biac ( 山本 康彦 )http://www.bluewatersoft.jp

速攻入門 C# プログラミング

技術評論社、共著2012/3

Windows 8 業務アプリ開発読本

技術評論社、共著2013/3

C# でマルチスレッド プログラミング ( 仮題 )

【近刊予定】

NOW

PRINTIN

G

Page 6: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • 記事を書いたり

biac ( 山本 康彦 )http://www.bluewatersoft.jp

WinRT/Metro TIPS

@IT ~ 連載中http://www.atmarkit.co.jp/ait/subtop/features/da/ap_winrttips_index.htm

l

C# で始めるテスト駆動開発入門

CodeZinehttp://codezine.jp/article/corner/446

Metro スタイル・アプリの開発者が知るべき 3 つのこと

@IT 2012/3http://www.atmarkit.co.jp/fdotnet/chushin/readyforwin8app_01/

readyforwin8app_01_02.html

TDD

今日の話は、この連載の中から !

Page 7: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • アプリを作ったり

biac ( 山本 康彦 )http://www.bluewatersoft.jp

Page 8: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • スピーカーやったり

2013/5/11 COD 2013

biac ( 山本 康彦 )http://www.bluewatersoft.jp

Page 9: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

スピーカー紹介 • 講師やったりしてます

biac ( 山本 康彦 )http://www.bluewatersoft.jp

C# / VB.NET によるWindows 8 アプリ開発入門

2013/7/11 ~ 12名古屋ソフトウェアセンター

http://www.nagoya-sc.co.jp/ap/seminar?m=1&key=10734

Page 10: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

データ バインディングってどこで使うの ?

まだまだ前振り

Page 11: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

データ バインディングの使いどころ

赤枠で囲った表示部分は、データ バインディングを使ってます。

画面表示 ≒データ バインディング

Page 12: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

データ バインディング

良いところ• データを変更すれば、

自動的に画面も更新される

すなわち、* 非同期でのデータ更新* バックグラウンド タスクでの画面更新が簡単♪

悪いところ• 最初がめんどくさい

• なんといっても、難しい !!

Page 13: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

データ バインディングによる画面更新

データの中身を非同期で書き換えてやるだけで、画面表示も変わる。

※注 : 正確には、データの取得処理を非同期で行い、データの書き換えは UI スレッドに戻してから行う。

Page 14: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

データ バインディングの原理的なお話

そろそろ本題

Page 15: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

バインディングのソースとターゲット、そして Binding クラス

http://msdn.microsoft.com/ja-jp/library/cc278072.aspx

画面 ロジック

注意 : バインディング エンジンから見えないといけないので、どちらも public にしておく必要がある

Page 16: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

バインディング ソース

• 表示したいデータをプロパティとして公開

• 動的に表示を変えたいなら、INotifyPropertyChanged を実装すること

Page 17: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

バインディング ターゲット

• バインドしてもらいたいプロパティをDependencyProperty ( 依存プロパティ )として実装

Page 18: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

バインディングする

• Binding オブジェクトを生成し、バインディング ソースを教える

• BindingOperations クラスに頼んで、上で作った Binding オブジェクトを、ターゲットにバインドしてもらう

ソース ターゲットBinding オブジェクト

Page 19: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

原理は以上 !!

• バリエーションがいっぱい !だから、ややこしくなる ( 汗 ;

Page 20: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

単純なバリュー オブジェクトのデータ バインディング

基本をしっかり !

Page 21: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #31 文字列をコントロールにバインドするには?

• XAML 側でバインドする例

http://www.atmarkit.co.jp/ait/articles/1304/04/news055.html

※ INotifyPropertyChanged の実装は、必須

方法その 1:INotifyPropertyChanged のイベントをそのまま使う ( バインドしない )

方法その 2:コードだけでバインドする( 前述 )

方法その 3:コードからは、データソースをDataContext に与え、XAML でバインドする ( 右のコード→ )

Page 22: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #32 文字列以外の値をコントロールにバインドするには?

• バリュー コンバーターの例* バリュー コンバーターを作り、

*XAML でバリュー コンバーターのインスタンスを 定義して、

* バインド時にコンバーターも設定する

http://www.atmarkit.co.jp/ait/articles/1304/11/news027.html

・ ToString() 文字列以外の値をそのままバインドすると、 ToString() が呼び出される

・バリュー コンバーターバインド時に文字列フォーマットを変更するには、バリュー コンバーターを使う( 右のコード→ )

・ターゲットが文字列でない場合バインドするターゲットのプロパティが文字列でない場合も、バリュー コンバーターを使う

Page 23: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #33 バインドするデータのPropertyChanged を楽に実装するには?

• リファクタリングの例* リファクタリング前

* リファクタリング後

http://www.atmarkit.co.jp/ait/articles/1304/18/news079.html

・ PropertyChanged イベント

INotifyPropertyChanged を実装するクラスでは、バインドに使うプロパティの全ての setterで、 PropertyChanged イベントを発火させるコードを書かねばならない ( すげーめんどう )

・リファクタリングリファクタリングすると、ずいぶん楽になる

・ BindableBase クラスじつは、 Common フォルダにBindableBase クラスが用意されている♪

Page 24: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #34 デザイン画面でデータをバインドするには?

• 2a. の例* 1. XAML でバインディング ソースを定義

* 2a.-3 コントロールの DataContext にソースを セットし、バインドも設定する

http://www.atmarkit.co.jp/ait/articles/1304/25/news064.html

1. XAML でソースを生成XAML のコードだけでバインディング ソースのインスタンスを生成

2a. コントロールのDataContextXAML で、コントロールのDataContext にセットする

または

2b. ページの DataContextXAML で、ページの DataContextにセットする。ページ内のコントロールには、ページのDataContext が伝播する

3. コントロールでバインド

Page 25: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #35 コントロール同士をデータ・バインドするには?

• 他のコントロールにバインドする例

スライダー コントロールの Value プロパティをテキスト ブロックの前景色と文字列にバインド

※ テキスト ブロックの前景色とのバインドには、 バリュー コンバーターも適用している

http://www.atmarkit.co.jp/ait/articles/1305/09/news030.html

・自分自身とバインド自分自身の他のプロパティにバインドできる※ ということは、コントロールのプロパティは、依存プロパティであるだけでなく、 INotifyPropertyChanged も実装していることになる。

・他のコントロールにバインド他のコントロールのプロパティにバインドするには、コントロールを名前で指定する

・定義時に見えないコントロール例えば、別の場所に定義するテンプレートなどでも、コントロールを名前で指定してバインド可能

Page 26: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

複雑な オブジェクトのデータ バインディング

基本が出来ていれば…

Page 27: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #36 データ・コレクションをバインドするには?

• コレクションをコントロールにバインドするイメージ

① コレクションをコントロールの ItemsSource にセット② コントロールは ListViewItem オブジェクトを必要なだけ生成し、 ItemsSource にセットされたコレクションの各アイテムを ListViewItem オブジェクトの Data Context に割り当て③ これで、コレクションの各アイテムが、個々のListViewItem の Data Context にセットされた

http://www.atmarkit.co.jp/ait/articles/1305/16/news060.html

・ List<T> などのコレクションそのままでもバインド可能。だが、デザイン時にサンプル データを表示できないので、自前のクラスを作ったほうが良い

・ ItemsSource プロパティコレクションは、コントロールのItemsSource プロパティにセットする

コレクション内の個々のアイテムを、コントロールが必要に応じて自動的にバインドしてくれる

Page 28: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

MetroTips #37

? ? ?

※ コレクションと来たら、次はコレクションも値も持っている複合オブジェクト …かな ? f(^^;

乞うご期待 !!

バインディングをネタにした連載はもうちっとだけ続くんじゃ♪

Page 29: わんくま名古屋#27(20130518) データバインディングを極める

わんくま同盟 名古屋勉強会 #27

ご清聴ありがとうございました