2012-03-17 6 views
0

私はControl、FooControlを持っています。 HasErrorという名前の読み取り専用DependencyPropertyを公開する必要があります。このプロパティの値は、実際はFooControlのControlTemplateのコントロールからの値です。ControlTemplateの子コントロールから値を取得したコントロールの読み取り専用依存プロパティを公開します

それが読み書きたDependencyPropertyとしてFooControl.HasErrorを宣言するために私を強制的に除いて、次のコードは、私が欲しい、まさに実現(バインディングは、そうでない場合、値を設定することはできません。)

<ControlTemplate TargetType="FooControl"> 
    <ChildControl HasError="{Binding HasError, RelativeSource={RelativeSource TemplatedParent}}" /> 
</ControlTemplate> 

私がしようとしていますPART_を使って子コントロールを見つけたり、HasError ValueChangedイベントにアタッチしたり、値をコピーしたりするような煩わしい作業をする必要がありません。それは不快なので、私はこのようないくつかのプロパティを持っています。

+0

私はあなたが基礎となるコントロールで検証を使用していると仮定し、それを依存関係プロパティを通して公開したいと思いますか? Validationクラスには、コントロールからエラーを取得するために使用される静的メソッドがあるという事実が役に立ちます。 http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.gethaserror.aspx –

答えて

0

私は、依存関係プロパティーChildControl.HasErrorがフレームワークプロパティーメタデータオプションBindsTwoWayByDefaultを定義していると推測します。これは、{Binding HasError, RelativeSource={RelativeSource TemplatedParent}}のモードがTwoWayであることを意味します。これは、sourceプロパティが読み取り専用の場合には機能しません。

したがって、これはBindsTwoWayByDefaultをオーバーライドし、バインディングが動作するはず

{Binding HasError, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay} 

への結合を変更します。

+0

私の質問の要点は、双方向で動作する方法でした。 – wasabi

+0

'TwoWay'データバインディングは、両方のプロパティが書き込み可能な場合にのみ使用できます。データバインディングの目的は、プロパティSが変更されたときにプロパティTの値を変更することです。したがって、Tは書き込み可能でなければならない。 TwoWayバインディングは、TがSとして機能し、SがTとして動作するミラーリングされた関係を追加します。つまりTwoWayバインディングでは、SとTの両方が書き込み可能でなければならない。 –

+0

私は知っています。私は私の元の質問で多くを言った。だから私は自分が望むものを達成するための適切な方法を見つけようとしています。おそらく、PARTのものを使う以外の良い方法はありません。 – wasabi

関連する問題