◆ DependencyProperty を GetValue で取得すると値が設定されていない場合はデフォルト値
◆ enum だとひとつめの値になる
◆ 未設定と知りたいときには nullable 型にして 初期値を null にしておく

あたりまえかも なことですが変に困ってしまったので


添付プロパティは好きな DependencyObject プロパティを追加できるものです
こっちのページでも少し触れてます

WeakMap のようなもので 通常のプロパティと違いオブジェクトの外側で キーとなる DependencyObject と対応付けて保存してるので 値がない状態と指定した型のなんらかの値が入ってる状態があります

値を取得するときは
dependency_object.GetValue(AttachedProperties.SampleEnumProperty)
のようになります

DependencyObject のメソッド GetValue に値がほしい DependencyProperty を渡します

ここで返ってくる値は DependencyProperty に設定した型の値です(GetValue 自体は object 型で返しますけど)

なので enum の場合は 値が設定されていないと最初の値になります


例えばソート順 ASC/DESC とか 曜日 Sunday/Monday/... とかそういう enum があったときに値があった場合に何かするという前提なのに値を取り出すと最初の値になってるというのはとても困ります

DependencyObject のメソッドに DependencyProperty が存在するのかチェックするメソッドがあるのでは?と探してみましたがみつかりませんでした
Get/Set/Clear はありますが Contains のようなものはないです

enum 項目の最初に未設定という特殊な値をいれて自分でそれを使うことはないようにしようとも考えたのですが 本来の enum の選択肢としてないものが混ざるのは気持ち悪いです
DependencyProperty 用にもともとの enum に未設定を追加した版をつくるというのも考えましたが毎回作るのは手間ですし元の方に変更があった場合に DependencyProperty 用のほうの更新忘れなどバグの元にもなります
リフレクションで自動生成できないかを考えたのですがそれだと XAML に書けないように思うのでなしです


どうすればいいんだーー としばらく考えていたらふと

Nullable でよくない?

というお告げが聞こえてきました


型に 「?」  をつけて Nullable にして DependencyProperty を作るときの初期値に null を設定します
これで GetValue で取得したときに未設定なら null が設定されています

if (dobj.GetValue(SampleEnumProperty) != null)
{
    // やること
}

と書けば その DependencyObject に添付プロパティが設定されていた場合にのみ処理をすることができます



あれこれ機能は揃ってる C# で DependencyObject に DependencyProperty の値が設定されてるかがわからないなんておかしいと思うので何かあるはず と調べていたら値が設定されてるかチェックする方法が見つかったので気になる人はこちら

AttachedProperty が設定されているか調べる