2016-09-10 11 views
1

私は現在、次のようなスタックパネルのラベルとテキストボックスで構成されます私の最初のユーザーコントロールを書いています:ユーザーコントロールのすべての基本プロパティに依存プロパティが必要ですか?

<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など)でさらに多くのプロパティを使用したい場合、これはさらに多くの作業です。

+1

TextBoxに何かがない場合を除き、TextBoxをサブクラス化するだけです。またはTextBoxBase。つまり、プロパティはバインディングターゲットになる依存プロパティでなければならず、(有用な)バインディングソースになる必要があります(INotifyPropertyChangedをサポートしていない限り、値が変更されたときにPropertyChangedを発生させます)。私はそれがうまくいくかどうかは言うことができません;スニペットでDPを生成するので、大きな面倒はありません)。 –

+2

_ "基本的には、ユーザーコントロールのプロパティを同じ名前のテキストボックスのプロパティにリダイレクトするだけです" _なぜそうするのでしょうか?なぜでしょうか? 'UserControl.Width'と' Height'プロパティはユーザコントロールの幅と高さをコントロールしますか? 'TextBox'と他の子を、それらのコンテナの次元、すなわち' UserControl'に基づいてレイアウトするべきではありませんか?簡単なパススルーが必要な場合は、 'ControlTemplate'を作成し、' UserControl'の代わりに '{TemplateBinding}'を使用する方が理にかなっています。 –

+0

@EdPlunkettそれについては考えていない。私の "実際の" TextBoxの各プロパティをTextBoxクラスから継承するユーザーコントロールのプロパティに手動でバインドする必要はありませんか?何かのように 'TextBoxテキスト= {バインディングRelativeSource = {RelativeSource FindAncestor、AncestorType = {x:タイプUserControl}、パス=テキスト}} Width =" 60 "/> //未テストコード' – Choub890

答えて

1

あなたはTextBoxではなくUserControlから派生することを決定した場合に冗長作業を保存することができます - ちょうど「ラベルされたテキストボックス」として、あなたのコントロールを考えると、あなたがする必要があるすべては、対応するTextBoxから派生し、必要な依存関係プロパティを追加することですラベルのために。これはもちろん、より複雑なユーザーコントロールの場合には当てはまりませんが、あなたのケースではOKです。

しかし、これの欠点は、TextBoxの既定のコントロールテンプレートを使用してラベルを追加する必要があることです。これは少し難解かもしれません。

いずれにしても、WPFで最初のコントロールを書くときに非常に便利な、Control Authoring OverviewページをMSDNで見ることをおすすめします。

関連する問題