2011-09-12 9 views
1

プロパティが変更されたときに通知する必要のある複数のC#オブジェクトがあります(このプロパティは、ボタンやリストボックスのようにFrameworkElementに属します)。コードの後ろからSetBindingを複数呼び出す

// DepOb is my FrameworkElement 
// DepPropDesc is the DependencyPropertyDescriptor 

System.Windows.Data.Binding bind = new System.Windows.Data.Binding(); 
bind.Source = this; 
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
bind.Path = new PropertyPath("Value"); 
bind.Mode = ob.BindingMode; 
DepOb.SetBinding(DepPropDesc.DependencyProperty, bind); 

をしかし、私は第2の目的を作成し、それをバインドするとき、最初の1は、もはや呼び出されます。

私は謙虚に、このようSetBindingメソッドを使用して単一のオブジェクトを結合テストしていません。私が行間を読んだ場合、メソッドはバインディングを設定するので、前のものはフラッシュされます。

MSDNは "マルチバインディング"オブジェクトについて語っていますが、新しいバインディングを追加できるように、以前のバインディングをマルチバインディングに "取得"する方法がわかりません。

私は検索を続けますが、ここにいる誰かが私が間違っているかもしれないアイデアがあるかどうかを見たいと思っていました。

ありがとうございます!

Seb

+0

これはあなたの質問に答えましたか? –

答えて

2

バインディングは、最初のオブジェクトにバインドする2番目のオブジェクトに設定されます。 2番目のオブジェクトにバインドを設定すると、2番目のオブジェクトに設定されていた値が失われ、最初のオブジェクトの値を読み書きできます(TwoWayに設定されている場合)。この例では

grid3.SetBinding(FrameworkElement.WidthProperty, new Binding("ActualWidth") { Source = grid1 }); 

、彼らが使用できるようにWidthPropertyはのFrameworkElement grid2とGRID3に定義された静的な読み取り専用プロパティは、FrameworkElementから継承されます。あなたは、その後も行うことができGRID3を持っているためそこ

grid2.SetBinding(FrameworkElement.WidthProperty, new Binding("ActualWidth") { Source = grid1 }); 

このプロパティ。

コードでは、このような記述が必要です(モードでBindingMode.OneWayに注意)。それのクラス定義上

System.Windows.Data.Binding bind = new System.Windows.Data.Binding();  
bind.Source = this;  
bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;  
bind.Path = new PropertyPath("Value");  
bind.Mode = BindingMode.OneWay; 
DepOb.SetBinding(DepObClass.WidthOrSomethingProperty, bind); 

インスタンス(DepOb)に結合されているので、あなたが実際のプロパティを定義(または継承いずれかを使用)する必要がありますように:

public static readonly DependencyProperty WidthOrSomethingProperty = DependencyProperty.Register("WidthOrSomething", typeof(double), typeof(DepObClass), null); 

DepObClassあなたの実装では

public double WidthOrSomething 
{ 
    get { return GetValue(WidthOrSomethingProperty); } 
    set { SetValue(WidthOrSomethingProperty, value); } 
} 

希望のプロパティを定義する必要があります。

関連する問題