【问题标题】:Can I specify which Columns are editable in a WPF DataGrid?我可以指定 WPF DataGrid 中哪些列是可编辑的吗?
【发布时间】:2010-12-17 15:23:12
【问题描述】:

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

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

【问题讨论】:

    标签: wpf datagrid editing


    【解决方案1】:

    下面的示例可以解决一列或多列

      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
            }
    
        } 
    

    【讨论】:

      【解决方案2】:

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

      编辑: 急忙回答,不好意思。我只能猜测,如果可能的话,你不应该自动生成列,这样你就可以控制哪些是只读的,哪些 controltemplate 去哪里......只需使用列的 Binding 属性,这样你就不需要自动生成它们。

      【讨论】:

      • AutoGenerateColumns 是必需的,因为创建 DataGrid 的查询是用户定义的
      • 我认为这篇文章可能会对您有所帮助:blog.smoura.com/wpf-toolkit-datagrid-part-ii-custom-styling 您需要创建自己的风格才能实现这一点,但我认为它完全可以做到
      • 不错的文章,但在我的情况下并不是很有用。我需要根据其 DisplayIndex 或 ColumnName 设置列是否可编辑,并且我事先不知道除了单个可编辑列之外我的列将是什么。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        private void dgTableDetailAdj_RowEditEnding(对象发送者,DataGridRowEditEndingEventArgs e)
        {
            foreach(dgTableDetailAdj.Columns 中的 DataGridColumn col)
            {
                if (col.Header.Equals("columnName"))
                {
                    col.IsReadOnly = true;
                }
            }
        }

        【讨论】:

        • 请正确格式化您的代码(缩进至少 4 个空格,并且缩进不要超出要求)。此外,不鼓励仅使用代码的答案,因为它们没有说明如何解决问题。请问edit your post可以解决这些问题吗?感谢并欢迎使用 StackOverflow。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        • 2012-11-21
        相关资源
        最近更新 更多