WPFのデータバインディングで納得いかない挙動 その2【解決編】
昨日(今朝?)のエントリ
だが現実は無常。なぜか1テンポ遅れて設定されるのな。理由はわからない。
幽霊の正体見たり枯れ尾花っつーか、この世には不思議なことなど何もないのだよ、関口君。・・・と言うか。
ま、夜中の1時半とかからスタートするのがアカンって教訓かもなあ。
public List<Item> Items { get { return _items; } set { _items = value; OnPropertyChanged1("Items"); } } public Item SelectedItem { get { return _selectedItem; } set { OnPropertyChanged1("SelectedItem"); _selectedItem = value; } }
↑ここがバグってる。こういうUI要素と間接的に結びつくような、言い換えるとロジックから起動するイベントを経由するような場合に単体テストがどれくらい有効なのか不明やけど、テストが書けないような部分では無いんで、きっちりテストファーストでやってれば、少なくともこのバグは回避出来たやろな。
もう少し定石的な視点で言えば、典型的なロジックの非対称性の害って奴で、逆にこの順序を入れ替える方が難しい。自分でコピペして書いた筈なのになんで順番が入れ替わってんのか不思議なくらい。(ヒント:キーボードとVMWare fusion)
OnPropertyChanged1("SelectedItem"); _selectedItem = value;
そう順番が逆なのな。プロパティの値を更新する前に変更通知を行ってる。そら、1テンポずれるわ。
_selectedItem = value; OnPropertyChanged1("SelectedItem");
この辺に、「良くわかってない」とか「挙動が直感的じゃない」とか「思ったように動いてくれない」って先入観があるってことなのな。
まずは、冷静に自分のコードがおかしいってところを疑えと。新人か!
でもわかって良かった。3時間ぐらい使っちゃったけど、その回り道のおかげで理解が進んだところも多い。
ロジックの対称性大事!