我可以指定哪些列可在WPF DataGrid中编辑吗?

时间:2010-12-17 15:23:13

标签: wpf datagrid editing

我有一个带有AutoGenerated列的WPF 4.0 DataGrid。我想只允许用户编辑第一列。这样做有简单的方法吗?

我试图添加一个DataGridCell样式并根据ColumnName(第一列总是具有相同名称)或ColumnIndex设置它的编辑能力,但是我无法找到正确的XAML,或者即使它是可能的。

4 个答案:

答案 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;
        }
    }
}