質問: Livetを使ってデスクトップアクセサリのようなものを作っているのですが、ViewModel側からウィンドウの位置・サイズを変えたくて以下のような記述をXAMLに書きました。 ``` ... ``` ※Top, Left, Width, Heightの各プロパティはlpropスニペットでdouble型で作成しています これでWidthやHeightは上手くいったのですが、LeftとTopの更新が反映されません。 ViewModelのコンストラクタ内で設定した値は効いているようですが、別途バインドしたコントロールから変更したり、LivetのViewModelテンプレートにある`Initialize()` 内で変更したりしてもウィンドウの位置が変化しません。 (あるいはウィンドウ位置の操作にはMessengerを使うべきなのでしょうか?)
回答: (詳細が気になったので調べた結果を書きます) WPFの `Window` クラスはウィンドウが表示されるときや手動でリサイズされたとき、依存関係プロパティ `Left` `Top` `Width` `Height` に実際のウィンドウから得た値を設定します。 この時 `BindingMode.OneWay` でバインディングが行われていると、既存のバインディング設定を消去した上で値が設定されるため、今回のような挙動になっていたようです。 ということを踏まえた回避策としては、 * `BindingMode.TwoWay` でバインドする (前述の場面でWindow側から値が設定される) * 直接バインドすることを避ける (添付プロパティやBehaviorを使ってバインドする、Messengerを使うなど) といったところでしょうか。 参考 * OneWay binding stops working after the target manually updated - Stack Overflow