2016-10-27 8 views
0

私が目指している動作は次のとおりです。私は単一の列を持つデータグリッドを持っています。人に関する様々な情報を含む項目のリストにバインドされています。選択されていない場合、その行には単に人の名前が表示されます。行が選択された(クリックされた)とき、私はその人に関するより多くの情報を表示することでした。行選択のDataGridセルの内容/テンプレートを変更します

私の最初の試みは、CellTemplateがContentControlであるDataGridTemplateColumnを使用することでした。 ContentControlのスタイルは、選択した行のステータスによって決まります。

私のスタイル:

<DataTemplate x:Key="NotSelectedTemplate"> 
    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, Path=DataContext.PatientName.FormattedName, Mode=OneWay, BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}" /> 
</DataTemplate> 

<DataTemplate x:Key="SelectedTemplate"> 
    <TextBlock Height="60" Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentControl}, Path=DataContext.PatientName.FormattedName, Mode=OneWay, BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataTemplate> 

<Style x:Key="SelectableContentStyle" TargetType="{x:Type ContentControl}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="False"> 
      <Setter Property="ContentTemplate" Value="{StaticResource NotSelectedTemplate}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True"> 
      <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

マイデータグリッドの列:

<DataGrid.Columns> 
    <DataGridTemplateColumn Width="*"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <ContentControl Style="{StaticResource SelectableContentStyle}" /> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

を作品このアプローチは、しかし、それぞれのDataTemplateに結合することはかなり醜いです。私はWPFで比較的経験がないので、これを実装するにはもっと良い方法があるはずです。

基本的に、 1)この動作を実現するには、より良い方法がありますか? 2)DataTemplateにバインドするより良い方法があるので、プロパティにアクセスするたびにRelativeSourcesを追跡していませんか?

+0

それは私がそれを行う方法はかなりです。 –

+0

私は参照してください。しかし、DateTemplatesのバインディングは非常に醜いです。 5つ以上のtextblock/properiesバインディングがあることを考慮して、各DataTemplate内のバインディングをより洗練された方法で行うことを望んでいました。 – krames

答えて

0

ContentTemplateProperty用のテンプレートセレクタを実装できます。このテンプレートセレクタは、2つのテンプレートをプロパティとして使用し、それらを切り替えるブール値のプロパティを1つ持っています。

悪いニュースは、基本クラス(DataTemplateSelector)が依存オブジェクトではないため、フラグプロパティのバインディングをサポートしていないということです。そのような場合は、カスタムクラスのインスタンスを保持するConfigプロパティを追加することでその問題を回避します。サブクラスをDependencyObjectにしてそこに依存プロパティを定義することができます。 これは当然、あなたのコードを再び膨らませ、非合理的に言ってバインディングスコープが壊れるので、バインディングには限界があります。


別のオプションは、DynamicResourceを経由してあなたは一度だけそのDataTriggerスイッチを書き、単に個々のDataTemplates内のリソースで2つのテンプレートを定義する必要があり、そのようにSelectableContentStyleで2つのテンプレートを参照するようになるかもしれません。

例としてthis answerを参照してください。

関連する問題