私はすでに問題を解決する方法を知っていますが、なぜこのように機能するのか説明が必要です。Text
コントロールのプロパティを設定するテスト添付プロパティを作成しましたTextBlock
。添付プロパティにより多くのパラメーターが必要なため、一般的なプロパティ ( IGeneralAttProp
) を受け入れるようにプロパティを作成したので、次のように使用できます。
<TextBlock>
<local:AttProp.Setter>
<local:AttPropertyImpl TTD="{Binding TextToDisplay}" />
</local:AttProp.Setter>
</TextBlock>
Setter
添付プロパティとIGeneralAttProp
インターフェイスの実装は次のとおりです。
public class AttProp {
#region Setter dependancy property
// Using a DependencyProperty as the backing store for Setter.
public static readonly DependencyProperty SetterProperty =
DependencyProperty.RegisterAttached("Setter",
typeof(IGeneralAttProp),
typeof(AttProp),
new PropertyMetadata((s, e) => {
IGeneralAttProp gap = e.NewValue as IGeneralAttProp;
if (gap != null) {
gap.Initialize(s);
}
}));
public static IGeneralAttProp GetSetter(DependencyObject element) {
return (IGeneralAttProp)element.GetValue(SetterProperty);
}
public static void SetSetter(DependencyObject element, IGeneralAttProp value) {
element.SetValue(SetterProperty, value);
}
#endregion
}
public interface IGeneralAttProp {
void Initialize(DependencyObject host);
}
およびAttPropertyImpl
クラスの実装:
class AttPropertyImpl: Freezable, IGeneralAttProp {
#region IGeneralAttProp Members
TextBlock _host;
public void Initialize(DependencyObject host) {
_host = host as TextBlock;
if (_host != null) {
_host.SetBinding(TextBlock.TextProperty, new Binding("TTD") { Source = this, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
}
}
#endregion
protected override Freezable CreateInstanceCore() {
return new AttPropertyImpl();
}
#region TTD dependancy property
// Using a DependencyProperty as the backing store for TTD.
public static readonly DependencyProperty TTDProperty =
DependencyProperty.Register("TTD", typeof(string), typeof(AttPropertyImpl));
public string TTD {
get { return (string)GetValue(TTDProperty); }
set { SetValue(TTDProperty, value); }
}
#endregion
}
AttPropertyImpl
がから継承されている場合、すべて正常に動作しFreezable
ます。DependencyObject
メッセージとのバインドに失敗するだけの場合:
ターゲット要素の管理 FrameworkElement または FrameworkContentElement が見つかりません。BindingExpression:Path=TextToDisplay; DataItem=null; ターゲット要素は 'AttPropertyImpl' (HashCode=15874253) です。ターゲット プロパティは 'TTD' (タイプ 'String') です
の場合FrameworkElement
、バインドにエラーはありませんが、値はバインドされていません。
問題は、正しく動作するためになぜAttPropertyImpl
継承しなければならないのかということです。Freezable