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
。幸运的是,DataGridRow
是DataGridRowHeader
的视觉祖先,因此使用RelativeSource
绑定并获取相关属性的值相对简单:DataGridRow.IsEditing
和DataGridRow.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 自定义行标题的主要内容,如果未能解决你的问题,请参考以下文章