【发布时间】:2017-03-10 12:59:32
【问题描述】:
我的目标是:我有一个单列数据网格。它绑定到包含有关个人的各种信息的项目列表。未选中时,该行仅显示此人的姓名。当该行被选中(即点击)时,我将显示有关此人的更多信息。
我的第一次尝试是使用 DataGridTemplateColumn,其中 CellTemplate 是 ContentControl。 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 个以上的文本块/属性绑定,我希望在每个 DataTemplate 中有一种更简洁的绑定方式。