2011-11-07 9 views
4

DataTemplateで別の頭痛があります。SL4。 ElementNameによるバインドがDataTemplate内で機能していません


説明: シルバー4、MVVM、等(SilverlightのLOBアプリケーションのための開発ツールのスタンダールセット)を使用。

エンティティのリストは、DataGridに結びついています。 1つのプロパティ(nullable bool BoolValue)は、エンティティの動作を担当し、画像付きのDataGridに表示されます。クリックすると、LayoutRootエレメント内の一部のコントロールの可視性が変更されます。

問題: 問題がDataTemplate内の結合は、このテンプレート内に配置されているものを除いて、他の要素を見ていないElementName、残念なことにまたは幸い、ということです。

コードサンプル:

<navigation:DataGridTemplateColumn Width="40" 
           CanUserReorder="True" 
           CanUserSort="False"> 
    <navigation:DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
      <Border Background="GhostWhite"> 
      <Grid> 
       <Image x:Name="ImageWithTrigger" 
        Grid.Column="1" 
        Margin="10,4,0,0" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Center" 
        Cursor="Hand" 
        Source="images/someImage.png" 
        Stretch="None" 
        Visibility={Binding BoolValue, Converter={StaticResource boolToVisibilityConverter} }> 
       <i.Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <AttachedBehaviors:TrickyBehavior FrameworkElementToHide="{Binding ElementName=FirstControlOutside}" 
                 FrameworkElementToShow="{Binding ElementName=SecoundControlOutside}"/> 
       </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Grid> 
      </Border> 
      </DataTemplate> 
    </navigation:DataGridTemplateColumn.CellTemplate> 
</navigation:DataGridTemplateColumn> 

上記の例では、FrameworkElementToHideとFrameworkElementToShowは常にnullです。

インターネットにはかなり類似した問題と解決策がたくさんありますが、この問題を解決するための簡単で洗練された方法はありませんでした。

答えて

6

このpostに私の答えをご覧ください。

ElementNameバインディングがDataGrid以内で機能していません。これを回避するにはプロキシが必要です。しかし、ElementNameバインディングは通常のDataTemplatesで動作します。 ItemTemplate,など

+0

'DataGrid'テンプレート内の' ElementName'でバインドする方法がないということですか? –

+0

いいえ、私はそうは思わない... –

+0

Dan Wahlinの例では、 'DataTemplate'内でViewModelにアクセスするための唯一の方法しか見つけられませんでしたが、' StaticResource'を使って私のケースでうまくいくようです。 –

1

[これはコメントする必要がありますが、私は許さ文字数を超え]私はこの問題を解決するための二つの方法を参照してください

を:

  1. ContentControlから継承。 2つの状態を切り替えるIsShowingプロパティ(bool)を追加します。新しいコントロールのコントロールテンプレートで、コンテンツを表示したり非表示にしたりする目的のアニメーションを作成します。
  2. 要素への参照を保持する辞書を保持する静的クラスを追加します。メタデータにPropertyChangedCallbackを持つ添付プロパティ(bool)を追加します。新しい値がtrueの場合は、次のように追加します:プロパティがアタッチされている要素を辞書に追加し、falseの場合は辞書から要素を削除します。各要素のキーはその名前です。ビヘイビアは要素の名前である2つの文字列を取得し、それらを辞書で検索します。

どちらの方法がとてもエレガントではありませんが、それはシルバーです... ;-)

+0

ありがとうございます。興味深いアプローチ。 –

関連する問題