DataGrid当SelectionUnit设置为DataGridSelectionUnit.Cell方式时:
RowDetailsVisibilityMode无论置为DataGridRowDetailsVisibilityMode.Visible还是/DataGridRowDetailsVisibilityMode.VisibleWhenSelected均无法显示行详细信息(RowDetails)内容。这是DataGrid本身的使用限制,有时我们确实不想整行(FullRow)选择,那么可以使用下面变通的方式使得行详细信息内容显示或隐藏。思路是给DataGrid应用一个数据触发器,将DetailsVisibility属性与实体的IsSelected(实体包含该属性并且实现接口INotifyPropertyChanged)属性进行关联;然后订阅DataGrid的CurrentCellChanged事件,在事件处理方法中设置绑定实体的IsSelected属性就能解决上述问题了。具体见下面代码:
<DataGrid.RowStyle> <Style TargetType="{x:Type DataGridRow}" > <Setter Property="DetailsVisibility" Value="Collapsed" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsSelected}" Value="true"> <Setter Property="DetailsVisibility" Value="Visible" /> </DataTrigger> <DataTrigger Binding="{Binding Path=IsSelected}" Value="false"> <Setter Property="DetailsVisibility" Value="Collapsed" /> </DataTrigger> </Style.Triggers> </Style> </DataGrid.RowStyle>
事件处理方法如下:
void dg_CurrentCellChanged(object sender, EventArgs e) { DataGrid dg = sender as DataGrid; RegisterTransaction o = dg.CurrentItem as RegisterTransaction; foreach (var item in CheckBook.Register) { if (item.IsSelected) item.IsSelected = false; } o.IsSelected = true; }