我有一个带有AutoGenerated列的WPF 4.0 DataGrid。我想只允许用户编辑第一列。这样做有简单的方法吗?
我试图添加一个DataGridCell样式并根据ColumnName(第一列总是具有相同名称)或ColumnIndex设置它的编辑能力,但是我无法找到正确的XAML,或者即使它是可能的。
答案 0 :(得分:14)
以下示例为一个或多个列提供了技巧
private void Grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column.Header.ToString() == "COLUMNNAME")
{
// e.Cancel = true; // For not to include
// e.Column.IsReadOnly = true; // Makes the column as read only
}
}
答案 1 :(得分:6)
每列都有IsReadOnly
属性。此外,整个DataGrid也具有IsReadOnly [这不会影响绑定,只会影响用户编辑字段的能力]
编辑: 匆匆回答,对不起。我只能猜测你不应该在可能的情况下自动生成列,这样你就可以控制哪些是只读的,哪个控制模板去哪里...只需使用列的Binding属性,这样你就不需要自动生成它们了。
答案 2 :(得分:6)
我明白了......这就是我用过的东西:
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="IsEnabled" Value="False" />
<Style.Triggers>
<DataTrigger Value="PART_IsSelected" Binding="{Binding Path=Column.Header, RelativeSource={RelativeSource Self}}">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
如果需要,可以使用Column.DisplayIndex
代替Column.Header
我仍然不确定为什么绑定不能直接工作并且需要被RelativeSource引用,但至少它可以工作:)
答案 3 :(得分:0)
private void dgTableDetailAdj_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { foreach (DataGridColumn col in dgTableDetailAdj.Columns) { if (col.Header.Equals("columnName")) { col.IsReadOnly = true; } } }