2012-01-27 7 views
0

双方向バインディングウィンドウの位置に動作していない、私は以下のXAML(非関連部分を削除)している私は、ウィンドウの位置を保持しようとしています

<Window x:Class="App.MainWindow" 
    Title="MainWindow" Name="mainWindow" 
    Top="{Binding Source={StaticResource Settings}, Path=Default.PositionY}" 
    Left="{Binding Source={StaticResource Settings}, Path=Default.PositionX}" 
    AllowsTransparency="True" WindowStyle="None" SizeToContent="WidthAndHeight" 
    Background="#01000000" Topmost="{Binding Source={StaticResource Settings}, Path=Default.AlwaysOnTop}" 
    MouseLeftButtonDown="mainWindow_MouseLeftButtonDown" 

「設定」App.xamlで定義されており、アプリの設定に対応

Googleでの検索では、私が使った方法とまったく同じ方法でいくつかの例を挙げています。

TopMostのバインディングは正確に期待通りに動作しますが、この値は実行間で維持されます TopとLeftのバインディングは片方向でしか動作しません。ウィンドウは設定から​​正しい場所を選択しますが、移動すると設定は更新されません。 Settings.Save関数のブレークポイントは、TopプロパティとLeftプロパティが期待どおりに変更されたことを示します。これらの値を保存直前の設定に手動でコピーしても問題ありません。私は両方のユーザー設定は、ウィンドウを移動するタイプとダブル

を定義している

PositionXと位置j(とにかくデフォルトでなければなりません)、明示的に影響なしにモード=双方向を指定しようとした は、以下のマウスハンドラ

で達成されます
private void mainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs args) 
{ 
    DragMove(); 
} 

双方向バインディングが一方向にしか動作しない理由は何ですか?

答えて

2

まあ、TwoWayを明示的に設定しなければ実際には機能しません。私はちょうどこれを試みた:

Top="{Binding Source={StaticResource Settings}, Path=Default.PositionY, Mode=TwoWay}" 
Left="{Binding Source={StaticResource Settings}, Path=Default.PositionX, Mode=TwoWay}" 

そしてそれは仕事をする。

INotifyPropertyChangedについて:これは他のバインディング方向、つまり起動時に一度動作するため、必要ではありません。そして、生成されたクラスに実装するのはおそらく難しいでしょう。

+1

Doh! - "TopMost"バインディングはTwoWayで動作するように見えましたが、今は動作しているように見える他のコードがあると思われます。 TwoWayを追加しても、最初の回は修正されませんでしたが、もう一度、 "厄介な"他のコード " – Taoist

0

バインディングを更新するためには、PositionYPositionXプロパティを公開するオブジェクトがINotifyPropertyChangedインターフェースを実装し、これら二つの特性が変更されたときPropertyChangedイベントを発生させる必要があります。あなたはコードのこの部分を表示していませんが、私が推測するのは、あなたがこれをやっていないということです。

1

ColinEが言ったこと:INotofiyPropertyChangedインターフェイスを正しく実装してください。私たちとあなたの設定クラスのコードを共有すると助けになるでしょう。

でも、バインディングモードMode=TwoWayを指定することを忘れないようにしてください。これは、あなたの質問で提案するデフォルトではありません。

+0

私は、INotifyPropertyChangedを実装するVS生成設定クラスを使用しています – Taoist