0

私はすでに問題を解決する方法を知っていますが、なぜこのように機能するのか説明が必要です。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

4

1 に答える 1

0

問題はAttPropertyImpl、要素ツリーにないことです。この投稿を見てください。このシナリオでの Freezable オブジェクトの役割について説明しています。

于 2012-10-22T09:57:15.847 に答える