1

アタッチされたプロパティで奇妙な問題が発生しました。RegisterAttachedの呼び出しでプロパティ名を割り当て、アタッチされたプロパティの名前(TranslatePropertyや "Translate"など)に適切な名前を付けると、アタッチされたプロパティの実装のコードが正しくなりません。火事。呼び出されないだけです。文字列名をTranslate以外(「Translate_」など)に変更すると、コードは正常に呼び出されます。

実装は次のとおりです。

パブリッククラスTranslateExtension:DependencyObject {

public static readonly DependencyProperty TranslateProperty =
    DependencyProperty.RegisterAttached("Translate_",
                                        typeof(bool),
                                        typeof(TranslateExtension),
                                        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));

public static void SetTranslate(UIElement element, bool value)
    {
        AssignKeys(element);
        element.SetValue(TranslateProperty, value);
    }
    public static bool GetTranslate(UIElement element)
    {
        return (bool)element.GetValue(TranslateProperty);
    }

    public bool Translate
    {
        set { base.SetValue( TranslateProperty,  value); }
    }
   ...
}

文字列のプロパティがTranslate_であるため、上記は実際に機能します。文字列の値を「翻訳」に変更すると失敗しました。

同じクラスに他に2つのアタッチされたプロパティがあり、それらはまったく同じ動作を示します。AttachedPropertyと同じ名前であり、呼び出されません。別の名前を付けると機能します。

ここで何が起こっているのかわかりません。私のコードは実際には無効な名前で機能していますが、その理由がわかりません。さらに重要なことに、この間違った名前が副作用を引き起こすかどうかもわかりません。

私が痛々しいほど明白な何かを見落としているかどうか誰かが見ることができますか?AttachedPropertiesの記事でいくつかの例を再検討しましたが、特別な名前を使用した実装は見当たりません。これらの実装では、常に文字列プロパティに添付プロパティと同じ名前が付けられています。

4

1 に答える 1

2

SetTranslate は呼び出されないため、余分なコードを追加しないでください。ここのMSDNから:

カスタム依存関係プロパティへの影響

プロパティ設定の XAML プロセッサ動作の現在の WPF 実装はラッパーを完全にバイパスするため、カスタム依存関係プロパティのラッパーのセット定義にロジックを追加しないでください。このようなロジックをセット定義に配置すると、プロパティがコードではなく XAML で設定されたときにロジックが実行されません。

同様に、XAML 処理からプロパティ値を取得する XAML プロセッサの他の側面も、ラッパーを使用するのではなく、GetValue を使用します。したがって、GetValue 呼び出し以外の get 定義での追加の実装も避ける必要があります。

代わりに、FrameworkPropertyMetadata に PropertyChangedCallback を追加してください。

于 2009-06-17T16:03:09.783 に答える