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も、同じような感覚で作っていけるのだけど、こうしたちょっとした違いが大変。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://c5d5e5.asablo.jp/blog/2018/03/17/8805327/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。