我可以为您翻译:我能否在WPF DataGrid中指定可编辑的列?

9

我有一个自动生成列的WPF 4.0 DataGrid。我只想允许用户编辑第一列。有没有简单的方法可以做到这一点?

我尝试添加一个DataGridCell样式,并根据ColumnName(第一列始终具有相同的名称)或ColumnIndex设置其编辑能力,但我无法找出正确的XAML,甚至不知道是否可能。

4个回答

20
下面的示例可对一个或多个列起作用。
  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
        }

    } 

8
我明白了...这是我使用的内容:

我明白了....这是我使用的:

<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引用,但至少它可以工作:)

8
每个列都有一个“IsReadOnly”属性。此外,整个DataGrid也有IsReadOnly属性[这不会影响绑定,只会影响用户编辑字段的能力]。
编辑: 匆忙回答了,抱歉。如果可能的话,应该避免自动生成列,这样可以控制哪些列是只读的,哪个控件模板放在哪里...只需使用列的Binding属性即可,因此您不需要自动生成它们。

AutoGenerateColumns是必需的,因为创建DataGrid的查询是用户定义的。 - Rachel
我认为这篇文章可能会对你有所帮助:http://blog.smoura.com/wpf-toolkit-datagrid-part-ii-custom-styling/ 你需要创建自己的样式才能实现,但我认为这完全可行。 - Machinarius
不错的文章,但对我的情况并不真正有用。我需要根据DisplayIndex或ColumnName设置列是否可编辑,而且我事先不知道除了单个可编辑列之外我的列会是什么。 - Rachel

0
私有 void dgTableDetailAdj_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { foreach (DataGridColumn col in dgTableDetailAdj.Columns) { if (col.Header.Equals("columnName")) { col.IsReadOnly = true; } } }

2
请正确格式化您的代码(至少缩进4个空格,不要超过所需缩进)。此外,仅提供代码答案是不鼓励的,因为它们没有解释如何解决问题。您能否编辑您的帖子以解决这些问题?感谢您并欢迎来到StackOverflow。 - Tim Malone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接