WPF DataGrid 自定义行标题

Posted

技术标签:

【中文标题】WPF DataGrid 自定义行标题【英文标题】:WPF DataGrid Custom Row Header 【发布时间】:2017-01-25 15:44:25 【问题描述】:

我正在使用 WPF / EntityFramework / MVVM 开发数据库前端

现在,当我允许用户将数据添加到数据网格(绑定到可观察集合)时,我被卡住了。

我想要实现的是在 MS Access 中获得一个行标题: 所以我的 WPF DataGrid 基本上应该是这样的:

有没有办法将 RowHeaderStyle 绑定到 RowState? 例如:

RowState.Editing:显示编辑图标 RowState.NewRow:显示明星 RowState.Default:显示默认行标题

到目前为止我没有找到解决方案,但我认为 WPF 应该足够强大以完成这项工作。

谢谢!

【问题讨论】:

P.S.:我不关心交替行颜色,我知道这可以通过在 DataGrid 中设置AlternatingRowBackground来完成 【参考方案1】:

简单。给DataGrid 一个RowHeaderStyle,根据DataGridRow 的状态交换不同的ContentTemplates。幸运的是,DataGridRowDataGridRowHeader 的视觉祖先,因此使用RelativeSource 绑定并获取相关属性的值相对简单:DataGridRow.IsEditingDataGridRow.IsNewItem

我使用<Label>New</Label> 等作为您想要使用的任何内容的任意替代。

<DataGrid 
    ItemsSource="Binding Rows"
    >
    <DataGrid.RowHeaderStyle>
        <Style 
            TargetType="x:Type DataGridRowHeader" 
            BasedOn="StaticResource x:Type DataGridRowHeader"
            >
            <!-- 
            Empty content template for default state. 
            Triggers below replace this for IsNewItem or IsEditing. 
            -->
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Label></Label>
                    </DataTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <DataTrigger 
                    Binding="Binding 
                        IsEditing, 
                        RelativeSource=RelativeSource AncestorType=x:Type DataGridRow" 
                    Value="True"
                    >
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Label>Edit</Label>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

                <DataTrigger 
                    Binding="Binding 
                        IsNewItem, 
                        RelativeSource=RelativeSource AncestorType=x:Type DataGridRow" 
                    Value="True"
                    >
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <Label>New</Label>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowHeaderStyle>
</DataGrid>            

【讨论】:

感谢您的回答,但它似乎不起作用。绑定到RowState 可能存在问题。在我看来,触发器Binding="Binding RowState" Value="EditRow"for example 永远不会被触发!? @CeOnSql 我不得不做出假设,因为您没有包含太多关于您的视图模型的信息。 RowState 是行项目上的属性吗?是不是叫RowState?当它的值改变时它会提高INotifyPropertyChanged.PropertyChanged 吗?如果您共享行项目类本身的来源,那将回答这些问题。 我想你误会了RowState不是我的底层对象的属性! RowState 我的意思是 DataGrid 的一个属性(如果它存在!?) @CeOnSql 感谢您的澄清。 DataGridRow 本身没有“状态”属性,但它确实有一些布尔标志属性,指示新行状态和编辑状态。我已经相应地更新了答案。 @CeOnSql 太棒了!

以上是关于WPF DataGrid 自定义行标题的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 的自定义行动画

具有自定义行布局的 ListView - Android

Eureka:自定义行的动态高度

如何在 androidleaback 库中自定义行的标题项?

xlform 使用笔尖的自定义行

由于 UITextView 中的自定义行距,文本选择不正确