Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

WPF4.5入門 その43 「読み取り専用の依存関係プロパティ」

$
0
0

これまで見てきた依存関係プロパティは全て読み書きできるものでしたが、読み取り専用の依存関係プロパティも定義できます。読み取り専用の依存関係プロパティは、DependencyPropertyKeyというクラスを使用します。

読み取り専用の依存関係プロパティの例を以下に示します。

// RegisterReadOnlyメソッドでDependencyPropertyKeyを取得privatestaticreadonly DependencyPropertyKey BirthdayPropertyKey =
    DependencyProperty.RegisterReadOnly(
        "Birthday",
        typeof(DateTime),
        typeof(Person),
        new PropertyMetadata(DateTime.Now));
// DependencyPropertyは、DependencyPropertyKeyから取得するpublicstaticreadonly DependencyProperty BirthdayProperty = BirthdayPropertyKey.DependencyProperty;

public DateTime Birthday
{
    // getは従来通りget { return (DateTime)GetValue(BirthdayProperty); }
    // setはDependencyPropertyKeyを使って行うprivateset { SetValue(BirthdayPropertyKey, value); }
}

コメントにある通り、DependencyPropertyKeyクラスのインスタンスはDependencyPropertyクラスのRegisterReadOnlyメソッドを使って取得します。このDependencyPropertyKeyクラスのインスタンスは、外部に公開しないように管理します。

DependencyPropertyのインスタンスは、DependencyPropertyKeyクラスのDependencyPropertyプロパティを使って取得します。これは、普通の依存関係プロパティと同じようにpublic static readonlyのフィールドで管理します。あとは、GetValueメソッドとSetValueメソッドを使ったCLRのプロパティのラッパーを作るのですが、このときSetValueではDependencyPropertyKeyのインスタンスを使って設定を行います。DependencyPropertyクラスのインスタンスを使うと例外が発生するので注意してください。また、プロパティのsetterは、読み取り専用の依存関係プロパティでは外部に公開しないように管理します。

このように、値の取得には内部で管理しているDependencyPropertyKeyクラスのインスタンスを使うようにすることで読み取り専用の依存関係プロパティを実現します。DependencyPropertyKeyクラスのインスタンスを外部に公開すると、読み取り専用ではなくなってしまうため実装するさいは注意をして行ってください。

過去記事


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>