私は現在、次のようなスタックパネルのラベルとテキストボックスで構成されます私の最初のユーザーコントロールを書いています:ユーザーコントロールのすべての基本プロパティに依存プロパティが必要ですか?
<Grid>
<StackPanel Orientation="Horizontal" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Label Content="{Binding Label}" Width="60"></Label>
<TextBox Text="{Binding TextBoxContent}" Width="60"/>
</StackPanel>
</Grid>
それがされるように、これは、設定ページであることが最も有用であろういくつかの異なる設定で再利用されます。これらの設定では、幅、高さ、検証ルール、エラーテンプレートのプロパティを(最低限)設定したいと思うでしょう。テキスト自体については、既にラベルとテキストボックスの両方に依存プロパティを作成しています(上のスニペットで分かるように)。
私の質問はこれです:実際に自分のユーザーコントロールを使用するときに設定したいと思っているすべてのプロパティの依存関係プロパティを作成する必要がありますか?これは冗長な作業のように思えます(すでにテキストボックスに存在するので、基本的にはユーザーコントロールのプロパティを同じ名前のテキストボックスのプロパティにリダイレクトします)。私のテキストボックス(例えば、AcceptsReturnなど)でさらに多くのプロパティを使用したい場合、これはさらに多くの作業です。
TextBoxに何かがない場合を除き、TextBoxをサブクラス化するだけです。またはTextBoxBase。つまり、プロパティはバインディングターゲットになる依存プロパティでなければならず、(有用な)バインディングソースになる必要があります(INotifyPropertyChangedをサポートしていない限り、値が変更されたときにPropertyChangedを発生させます)。私はそれがうまくいくかどうかは言うことができません;スニペットでDPを生成するので、大きな面倒はありません)。 –
_ "基本的には、ユーザーコントロールのプロパティを同じ名前のテキストボックスのプロパティにリダイレクトするだけです" _なぜそうするのでしょうか?なぜでしょうか? 'UserControl.Width'と' Height'プロパティはユーザコントロールの幅と高さをコントロールしますか? 'TextBox'と他の子を、それらのコンテナの次元、すなわち' UserControl'に基づいてレイアウトするべきではありませんか?簡単なパススルーが必要な場合は、 'ControlTemplate'を作成し、' UserControl'の代わりに '{TemplateBinding}'を使用する方が理にかなっています。 –
@EdPlunkettそれについては考えていない。私の "実際の" TextBoxの各プロパティをTextBoxクラスから継承するユーザーコントロールのプロパティに手動でバインドする必要はありませんか?何かのように 'TextBoxテキスト= {バインディングRelativeSource = {RelativeSource FindAncestor、AncestorType = {x:タイプUserControl}、パス=テキスト}} Width =" 60 "/> //未テストコード' – Choub890