12月 022015
 
Pocket

概要

一般的に、private setter を持つプロパティを TwoWay Binding すると、InvalidOperationException が発生して死ぬ。
しかし、ターゲットフレームワークが 4.5 の時のみ、何事もなかったかのように動作する。なにそれ……

※ OneWayToSource の場合も同様。

しかも private setter を経由して普通にプロパティ更新できる。ヤバい。
なお C# 6.0 の get-only プロパティの場合は InvalidOperationException となる。


原因

参照: WPF – Property with private setter is updated by a TwoWay binding | Microsoft Connect

どうやら .NET 4.5 のセキュリティ問題を含むバグだったらしく、セキュリティ問題は MS13-052 にて修正されたものの、既存アプリへの影響を考慮して .NET 4.5 をターゲットにしている場合のみ TwoWay Binding できる動作を残したらしい。


再現コード


4.5 でも例外吐かれるようにしたい場合

app.config に以下の設定を行うと、4.5 をターゲットにしている場合でも InvalidOperationException を吐くようになる。

[xml]





[/xml]


TwoWay Binding 挙動まとめ

ターゲット private-setter プロパティ get-only プロパティ
4.5 TwoWay Binding できちゃう InvalidOperationException
4.5 以外 InvalidOperationException InvalidOperationException
4.5 + app.config InvalidOperationException InvalidOperationException

 Leave a Reply