WPFのBindで自前のクラスからデータ供給2018年03月17日 13:25

UWPからは利用できないWindowsのAPIにアクセスするため、WPFのアプリに取り組んでいるが、Bindが思うようにいかない。UIの初期化後の画面では、想定するデータが設定されているが、その後の更新を反映しない。GetBindExpressionや、PropertyChangedのイベントハンドラを用意して確認してみると、うまくいきそうなのだけど。

XAMLでデータ供給元の定義

WindowのResourceで、データ供給元の定義。20行目で、システムボリュームに関するデータを供給するクラスを定義。

Bind先のSliderの定義

343行目でSliderの定義。これは、修正後。修正前は、こんな感じ。

Value="{Binding Source={StaticResource SystemVolume}, Path=CurrentVolume, Mode=OneWay}"

345行目は、Sliderの値をTextBlockで表示。隣のSliderからデータを読み取る。これは、問題なく動作する。

DataContextの再設定

いろいろやって、たどりついたのがこちら。

39行目;UIの構築完了を受けて、データ供給元のオブジェクトを生成。
対象のクラスは、INotifyPropertyChangedを実装していること。
49行目;Sliderを格納するGridのDataContextに、生成したオブジェクトを設定。

WPFのBindに関するHow-toの文書に、それらしいことが書いてある(最後の方、Howeverの後)。このあたり、UWPでは静的な定義をきちんとしておけば、よしなにやってくれていた。x:Bind など、使い勝手のよい拡張も進んでいる。

UWPもWPFも、同じような感覚で作っていけるのだけど、こうしたちょっとした違いが大変。