2009-05-15 20 views
4

これは私がDependencyPropertyを登録する方法である:WPF依存関係のプロパティ:なぜオーナータイプを指定する必要がありますか?

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


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

DependencyProperty.Register方法の三番目のパラメータは、依存関係プロパティ(この場合には、私のユーザーコントロールがNewOnlineUserNotifierと呼ばれている内に存在するコントロールの種類を指定する必要があります)。

私の質問は、なぜ実際に所有者のタイプを指定するのですか?実際の所有者と異なるタイプを指定するとどうなりますか?あなたからの登録メソッドを呼び出す

答えて

8

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

他のコントロールを含むカスタムコントロールを作成するときに役立ちます。これまでWinFormsでは、そのコンテナにのみ役立つが、意味的にはその子に属していた追加の情報がある場合、その情報を保留「タグ」プロパティに配置することができました。これは型の安全性を取り除いたもので、別のクラスがタグに何か他のものを保存しようとしないことは決して決してありませんでした。 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は、それがButtonクラスの真のメンバーであったかのようにそのFirstOwnerPropertyの値がそれと一緒に移動別のコンテナから移動されます。 Container2はChildButton.GetValue(FirstOwnerProperty)を呼び出し、ボタンを作成したButtonContainerを知ることができます(これを行う理由は、読者のための練習として残されています...)。これはすべて、ボタンを狭い専門分野にサブクラス化する必要なしに可能です。

+0

「ownerType」が異なる通常の「DependencyProperty」ではなく、接続プロパティを使用すべきですか? – Lukazoid

1

同じDependencyPropertyには、一言で言えば、いくつかの種類

1

のために(別のメタデータで)異なって定義することができますので、これはあなたがDPを登録しているとき、あなたはリストにオブジェクト(DP)を追加している、ありますクラス(所有者)に添付されます。この操作は宣言されているクラスにのみ存続し、しばしばそれに関連しません。

関連する問題