【问题标题】:Change DataGrid cell content/template on row select在行选择时更改 DataGrid 单元格内容/模板
【发布时间】: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 中有一种更简洁的绑定方式。

标签: c# wpf datagrid


【解决方案1】:

您可以为ContentTemplateProperty 实现一个模板选择器,它将两个模板作为属性,并有一个布尔属性在它们之间切换。

坏消息是基类 (DataTemplateSelector) 不是依赖对象,因此不支持绑定您的标志属性。在这些情况下,我通过添加一个Config 属性来解决这个问题,该属性包含一个自定义类的实例,然后您可以创建一个DependencyObject 的子类并在那里定义依赖属性。 这当然会再次使您的代码膨胀,并且绑定会受到限制,因为通俗地说,绑定范围会中断。


另一种选择可能是通过DynamicResource 引用SelectableContentStyle 中的两个模板,这样您只需要编写一次DataTrigger 开关,只需在单个DataTemplates 内的资源中定义这两个模板.

有关示例,请参阅 this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 2021-03-29
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多