2010-12-06 8 views
4

データテンプレートから親/祖先コントロールのプロパティを設定するにはどうすればよいですか?親テンプレートのプロパティをデータテンプレートから設定する

唯一の方法は、私のフォーム上にダミーの非表示のコントロールを作成し、コンバータのonewaytosourceとrelativesource findancestorバインディングを使用してプロパティのいずれかを正しいデフォルト値にバインドすることです。

私がしたいのは、異なるソースを使ってバインディングを使用するのと同じように、セッターに異なるコントロールをターゲットに設定させることです。

答えて

0

いくつかのオプション: 1)DataTemplate内のバインディングで、ElementNameを使用してソースを親に設定し、OneWayToSourceを使用してバインドします。これは、バインディングターゲット(DataTemplate内の要素)からバインディングソース(親コントロール)に値を転送します 2)DataTemplateとコントロールの両方がバインドする共通オブジェクトを使用します。 DataTemplateはOneWayToSourceを使用してそれにバインドし、コントロールはOneWayでバインドします。リソースでもあり、XAMLからアクセスできます。 3)RelativeSourceとFindAncestorを使用します。 4)何らかの種類のルーテッドイベントを使用し、コントロールレベルで処理します。データテンプレートから、添付された動作(google it!)によって解凍されます。イベントはデータを配信し、イベントハンドラはコントロールの関連プロパティを設定します。

オプション1,3は、あなたが提案したものと似ています。オプション2,4は異なっています。エレガンスに関しては、オプション2を優先します。

さらに、すべてのソリューションの競合に注意してください。 DataTemplateが単一のコントロールの中に何度もインスタンス化されると、すべてのインスタンスはコントロールのプロパティを設定しようとします。エフェクトは最後に実行されたセット試行の影響を受け、オーダーを制御できない場合は問題が発生することがあります。

アレックス。

+0

私はオプション2は、私の状況で本当に適しているとは思いません。 2つのことは、お互いを本当に知りません。オプション4は私にとっては最高の音ですが、イベントを処理してXAMLだけでプロパティを設定できますか?私はあなたができるとは思わなかった。 –

0

祖先がデータテンプレートの内部にあると仮定すると、「名前」プロパティを使用してその祖先に名前を付けることができます。名前がついたら、セッターの "TargetName"を使用して祖先を指定することができます。

例:

<DataTemplate> 
    <Grid Name="ControlGrid"> 
     <Path x:Name="Arrow" Fill="Black"> 
      <Path.Triggers> 
       <Trigger Property="IsEnabled" Value="false"> 
        <Setter Property="Visibility" TargetName="ControlGrid" Value="Collapsed"/> 
       </Trigger> 
      </Path.Triggers> 
     </Path> 
    </Grid> 
</DataTemplate> 
+0

いいえ別のコントロールをターゲットにする必要があります。それ以外は簡単です。 –

関連する問題