私の.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。
出力ウィンドウにバインドエラーがありますか?コントロールのバインディングは 'Value =" {Binding Friction、ElementName = window、FallbackValue = 0}です。 " - コントロールのルートを参照しているか、それともウィンドウを参照していますか?手動で変更された 'Friction'プロパティを起動するとどうなりますか? –
いいえ、私はこのバインディングについての出力でバインディングエラーを取得していません。はい、混乱して申し訳ありませんが、 "ウィンドウ"はコントロールルート自体を指します。物事をよりシンプルにするための私自身の大会です。ちょうどそれがコントロールかウィンドウであっても、 "ウィンドウ"という言葉を使ってルートに名前を付けるだけです。 –
INPC –