2012-02-14 15 views
0

私の.NET 4.0プロジェクトでは、パブリックフィールドを持つオブジェクトがあり、このオブジェクトはINotifyPropertyChangedも実装もDependencyObjectを継承しません。しかし、WPFコントロールでこのオブジェクトのフィールドに「バインド」するメカニズムが必要です。バインディングは依存関係のプロパティ(または少なくともプロパティとプロパティの変更の通知)を必要とするため、直接バインドできないことはわかっているので、必要なバインディング機能を実装するにはどうすればよいですか。非依存オブジェクトのフィールドへのバインド

void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public float Friction 
    { 
     get 
     { 
      if (CurrentObject != null) 
      { 
       return CurrentObject.Friction; 
      } 
      else 
      { 
       return 0.0f; 
      } 
     } 
     set 
     { 
      if (CurrentObject != null) 
      { 
       CurrentObject.Friction = value; 
       FirePropertyChanged("Friction"); 
      } 
     } 
    } 

    public PlatformObjectTemplate CurrentObject 
    { 
     get 
     { 
      return GetValue(CurrentObjectProperty) as PlatformObjectTemplate; 
     } 
     set 
     { 
      SetValue(CurrentObjectProperty, value); 
      FirePropertyChanged("Friction"); 
      FirePropertyChanged("CurrentObject"); 
      BindShapes(); 
      IntersectionComboBox.SelectedItem = CurrentObject.IntersectionStaticMethod; 
     } 
    } 

    public static readonly DependencyProperty CurrentObjectProperty = DependencyProperty.Register("CurrentObject", typeof(PlatformObjectTemplate), typeof(PlatformStaticObjectPropertyEditor), new PropertyMetadata(null)); 

私のWPFコントロールはINotifyPropertyChangedの実装を、そして私のPlatformObjectTemplateは、プロパティ、Frictionのようなだけでpublicフィールドを持っていない:私は私のWPFコントロールでは、このような何かを試してみました。私はそのようなXAMLのオブジェクトにバインドする必要があります:

(私のコントロールでは):// DoubleUpDownはWPFツールキットからです。 (私のメインウィンドウ内)

<tk:DoubleUpDown Margin="91,10,7,0" Name="doubleUpDown1" VerticalAlignment="Top" Value="{Binding Friction, ElementName=window, FallbackValue=0}" /> 

<my:PlatformStaticObjectPropertyEditor x:Name="platformStaticObjectPropertyEditor1" CurrentObject="{Binding CurrentObject, ElementName=window}" /> 

私は摩擦特性のゲッターにブレークポイントを入れて、それがCurrentObjectがバインドされ前をバインドしようとし、それがnullであるため、 、私はオブジェクトから正しい摩擦値を読み取ることができません。私は、Friction CurrentObjectのセッターでプロパティを変更しようとしましたが、CurrentObjectが設定されているときにFrictionを設定しますが、どちらも機能しません。

PlatformObjectTemplate意志ない使用特性:

[OK]を、ここでは2つの要件があります。それは公共のフィールドを持っています。 上記のXAMLで使用したのと同じように、宣言的なバインディング方法が必要です。

私はたぶん、複雑すぎることがあります。上記の私の要件の制約の中で、この権利を行う最も正しい "宣言的"な方法は何ですか?

ありがとう、 Can。

+0

出力ウィンドウにバインドエラーがありますか?コントロールのバインディングは 'Value =" {Binding Friction、ElementName = window、FallbackValue = 0}です。 " - コントロールのルートを参照しているか、それともウィンドウを参照していますか?手動で変更された 'Friction'プロパティを起動するとどうなりますか? –

+0

いいえ、私はこのバインディングについての出力でバインディングエラーを取得していません。はい、混乱して申し訳ありませんが、 "ウィンドウ"はコントロールルート自体を指します。物事をよりシンプルにするための私自身の大会です。ちょうどそれがコントロールかウィンドウであっても、 "ウィンドウ"という言葉を使ってルートに名前を付けるだけです。 –

+0

INPC –

答えて

1

object neither implements INotifyPropertyChanged nor inherits DependencyObject, and it will never. However, I need a mechanism to "bind" to fields of this object in my WPF control

poyra、私はこれと同じような状況があります。インスタンスフィールドにはバインドできないため、INotifyPropertyChangedを実装するラッパークラスを作成することをお勧めします。

+0

これは唯一実現可能な方法だと思います...ありがとうございます。 –

関連する問題