私が目指している動作は次のとおりです。私は単一の列を持つデータグリッドを持っています。人に関する様々な情報を含む項目のリストにバインドされています。選択されていない場合、その行には単に人の名前が表示されます。行が選択された(クリックされた)とき、私はその人に関するより多くの情報を表示することでした。行選択の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を追跡していませんか?
それは私がそれを行う方法はかなりです。 –
私は参照してください。しかし、DateTemplatesのバインディングは非常に醜いです。 5つ以上のtextblock/properiesバインディングがあることを考慮して、各DataTemplate内のバインディングをより洗練された方法で行うことを望んでいました。 – krames