8

これは私が登録する方法ですDependencyProperty

    public static readonly DependencyProperty UserProperty = 
        DependencyProperty.Register("User", typeof (User), 
             typeof (NewOnlineUserNotifier));                                                                                                                 


    public User User
    {
        get
        {
            return (User)GetValue(UserProperty);
        }
        set
        {
            SetValue(UserProperty, value);
        }
    }

メソッドの 3 番目のパラメーターではDependencyProperty.Register、依存関係プロパティが存在するコントロールのタイプを指定する必要があります (この場合、私のユーザー コントロールは と呼ばれますNewOnlineUserNotifier)。

私の質問は、実際に所有者の型を指定する理由と、実際の所有者の型とは異なる型を指定するとどうなるかということです。

4

3 に答える 3

7

Registerメソッドを呼び出すタイプは、プロパティの事実上の所有者ではありません。したがって、指定するタイプは実際の所有者であるため、実際の所有者とは異なるタイプを指定することはできません。

これが役立つ場合の例は、他のコントロールを含むカスタムコントロールを作成する場合です。以前のWinFormsでは、そのコンテナーにのみ役立つが、意味的には子に属する追加情報がある場合、その情報をhold-all"Tag"プロパティに配置するのが最善の方法でした。これは両方とも型安全性を取り除き、他のクラスがタグに何か他のものを保存しようとしないとは決して確信していませんでした。WPF依存関係プロパティを使用すると、オブジェクト自体が値を保持する必要なしに、値をオブジェクトに関連付けることができます。ささいな例:

public class ButtonContainer : Control
{
    public Button ChildButton { get; set; }

    public static readonly DependencyProperty FirstOwnerProperty =
    DependencyProperty.Register("FirstOwner", typeof(ButtonContainer),
         typeof(Button));

    public ButtonContainer()
    {
        ChildButton = new Button();
        ChildButton.SetValue(FirstOwnerProperty, this);
    }

}

これで、ボタンには、ButtonContainerのコンテキスト内でのみ意味があり、タイプセーフでカプセル化されたタグのように、ButtonContainerのコンテキスト内でのみアクセスできる追加のプロパティがあります。

次のように新しいクラスを使用します。

ButtonContainer container1 = new ButtonContainer();

ButtonContainer container2 = new ButtonContainer();
container2.ChildButton = container1.ChildButton;

ChildButtonが1つのコンテナから別のコンテナに移動されると、そのFirstOwnerPropertyの値は、Buttonクラスの実際のメンバーであるかのように一緒に移動します。Container2は、ChildButton.GetValue(FirstOwnerProperty)を呼び出して、どのButtonContainerが最初にボタンを作成したかを調べることができます(これを実行する理由は、読者の演習として残されています...)。これはすべて、ボタンを狭い専門分野にサブクラス化する必要なしに可能です。

于 2009-05-15T14:43:07.990 に答える
3

これは、同じ DependencyProperty を複数の型に対して (異なるメタデータで) 異なる方法で定義できるためです。

于 2009-05-15T16:01:47.800 に答える
3

簡単に言えば、DP を登録するときは、クラス (所有者) に関連付けられたリストにオブジェクト (DP) を追加します。この操作は、それが宣言されているクラスにのみ「存在」し、多くの場合、それに関連していません。

于 2009-05-15T16:57:26.077 に答える