HASTCounter:19907Today:9Yesterday:12Online:6TweetUserControlに実装したプロパティをBindingSourceにするAboutUserControlを利用して独自のコントロールを開発することは少なくありません。UserControlに独自のプロパティを実装し、その外観(コントロール)にプロパティの値を反映したい、ということも良くあります。プロパティの値が変更されたタイミングで、コントロール側の値を任意に変更することで実装できないこともないですが、スマートではありません。WPFを利用するのだから、Bindingを利用したいところです。Bindingする方法は多数あり、Binding方法によっては不具合を来す可能性があります。そこでBindingに関して苦戦したことをここにメモしていきます。"Programming/.NetFramework/WPF/Binding/BindingDependencyPropertyInUserControl";VisualStduio2012WPFここで扱うサンプルここで扱うサンプルにはもっとも単純なパターンを用意しました。あるUserControlにLabelとその他のコントロール(ここではGrid)を配置します。そのLabelのプロパティContentを、UserControlに実装したLabelプロパティから設定できるようにします。LabelプロパティはBindingのために依存プロパティ(DependencyProperty)として用意します。依存プロパティの解説についてはここでは行いません。残念ながら現状ではこれ以上の良い方法を見つけ出すことはできませんでした。効率の良い実装方法には見えませんが、問題を起こしにくい実装形態であると思います。RelativeSourceは動的に変更される可能性のある値をBindingに利用するための仕組みを提供しています。この仕組みの内、AncestorTypeを利用して、自分の要素(ここではLabel)を内包する、親の要素を対象に指定します。対象の指定の方法にはいくつかありますが、ここではTypeによる指定を利用します。Bindingしたい独自の依存プロパティ(DependencyProperty)はUserControlに実装しているわけですから、Typeの指定先はUserControlとします。}"/>もしも自分を内包する親の要素に複数のUserControlが存在し、その内のいずれかのUserControlを任意に設定する必要があるときは、AncestorLevelを指定します。msdnNameを利用する基本的には良くない方法、のハズなのですが、良くない理由を失念しました。実装したUserControlに何かしらのパラメータをBindingする際に不都合が出た記憶があります。プロパティが実装されるUserControlに適当な名前をつけてBindingに利用します。ここではx:Name="Root"としました。名前を付けたらBindingする方から参照に利用します。</Grid></UserControl>DataContextを利用する方法DataContextを利用して設定することもできなくはないです。基本的には良くない方法です。UserControlのDataContextはそれを利用する側に変更されてしまう可能性があるからです。DataContextを変更することによってコントロールにデータをBindingすることは良くあることです。DataContextが設定されている場合には、DataContextが持つプロパティの値をBindingすることができます。ここでは自分自身のプロパティを参照することができるので、任意に設定したDependencyProperty、Labelが利用できます。</Grid></UserControl>XAMLではなくコード側(ビハインド)からDataContextを設定することも考えられます。著作権Administrator。