我可以指定在WPF数据网格中哪些列是可编辑的吗?

我可以指定在WPF数据网格中哪些列是可编辑的吗?,wpf,datagrid,editing,Wpf,Datagrid,Editing,我有一个带有自动生成列的WPF4.0DataGrid。我只允许用户编辑第一列。有没有一个简单的方法可以做到这一点 我试图添加DataGridCell样式,并根据ColumnName(第一列始终具有相同的名称)或ColumnIndex设置其编辑能力,但是我无法找到正确的XAML,或者即使可能也是如此。每列都有一个IsReadOnly属性。另外,整个DataGrid也有IsReadOnly[这不影响绑定,只影响用户编辑字段的能力] 编辑: 匆忙回答,对不起。我只能猜测,如果可能的话,您不应该自动生成

我有一个带有自动生成列的WPF4.0DataGrid。我只允许用户编辑第一列。有没有一个简单的方法可以做到这一点


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

每列都有一个
IsReadOnly
属性。另外,整个DataGrid也有IsReadOnly[这不影响绑定,只影响用户编辑字段的能力]

编辑:
匆忙回答,对不起。我只能猜测,如果可能的话,您不应该自动生成列,这样您就可以控制哪些列是只读的,哪些controltemplate去哪里。。。只要使用列的绑定属性,就不需要自动生成它们。

我知道了。。。。以下是我使用的:

<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


我仍然不确定为什么绑定不能直接工作,需要由相对资源引用,但至少它可以工作:)

下面的示例为一个或多个列提供了技巧

  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
        }

    } 
私有void dgTableDetailAdj_RowEditEnding(对象发送方,DataGridRowEditEndingEventArgs e) { foreach(dgTableDetailAdj.Columns中的DataGridColumn列) { if(col.Header.Equals(“columnName”)) { col.IsReadOnly=true; } }
}AutoGenerateColumns是必需的,因为创建DataGrid的查询是用户定义的。我认为这篇文章可能会对您有所帮助:您需要创建自己的样式来实现这一点,但我认为这篇文章非常好,但在我的情况下并不真正有用。我需要根据某列的DisplayIndex或ColumnName设置该列是否可编辑,并且我事先不知道除了单个可编辑列之外,我的列将是什么。请正确设置代码格式(将所有列缩进至少4个空格,并且缩进量不要超过要求)。此外,不鼓励只使用代码的答案,因为它们没有解释如何解决问题。你能帮我解决这些问题吗?感谢并欢迎来到StackOverflow。 private void dgTableDetailAdj_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { foreach (DataGridColumn col in dgTableDetailAdj.Columns) { if (col.Header.Equals("columnName")) { col.IsReadOnly = true; } } }