1

私は WPF ユーザーコントロールをいじっていて、次の質問があります: プロパティが に作成された後にプロパティの初期化/割り当ての動作が変わるのはなぜDependencyPropertyですか?

簡単に説明しましょう:

UserControlクラスの次のコードを検討してください。

public partial class myUserControl : UserControl
{
    private string _blabla;
    public myUserControl()
    {
        InitializeComponent();
        _blabla = "init";
    }

    //public static DependencyProperty BlaBlaProperty = DependencyProperty.Register(
    //    "BlaBla", typeof(string), typeof(UserControlToolTip));

    public string BlaBla
    {
        get { return _blabla; }
        set { _blabla = value; }
    }
}

UserControlXAML ファイルで が初期化される方法は次のとおりです。

<loc:myUserControl BlaBla="ddd" x:Name="myUsrCtrlName" />

私が抱えている問題は、行set { _blabla = value; です。}は、 DependencyProperty宣言がコメント アウトされている場合にのみ呼び出されます (この例のように)。ただし、DependencyProperty行がプログラムの一部になると、set { _blabla = value; }行はシステムによって呼び出されなくなりました。

この奇妙な振る舞いを私に説明してもらえますか?

どうもありがとう!

4

1 に答える 1

1

GetValue依存関係プロパティのCLRラッパー(ゲッターとセッター)は、依存関係プロパティのメソッドとメソッドを呼び出すためにのみ使用する必要がありSetValueます。

例えば

public string BlaBla
{
    get { return (string)GetValue(BlaBlaProperty) }
    set { SetValue(BlaBlaPropert, value); }
}

これ以上のことはありません...
この理由は、バインディングがXAMLから実行されるときに、WPFバインディングエンジンが直接(たとえば、CLRラッパーを呼び出さずに)呼び出すためです GetValueSetValue

したがって、それらが呼び出されていないのは、実際には呼び出されていないためです。これが、CLRのGetメソッドとSetメソッドにロジックを追加してはならない理由です。


OPのコメントに基づいて編集DependencyProperty-変更時にコールバックメソッドを作成する例を次に示します。

public static DependencyProperty BlaBlaProperty = 
       DependencyProperty.Register("BlaBla", typeof(string), Typeof(UserControlToolTip), 
       new FrameworkPropertyMetadata(null, OnBlachshmaPropertyChanged));


private static void OnBlachshmaPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
        UserControlToolTip owner = d as UserControlToolTip;

        if (owner != null)
        {
            // Place logic here
        }
 }
于 2013-01-06T08:50:14.800 に答える