12月 022015
概要
一般的に、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]
[/xml]
TwoWay Binding 挙動まとめ
ターゲット | private-setter プロパティ | get-only プロパティ |
---|---|---|
4.5 | TwoWay Binding できちゃう | InvalidOperationException |
4.5 以外 | InvalidOperationException | InvalidOperationException |
4.5 + app.config | InvalidOperationException | InvalidOperationException |