【发布时间】:2010-12-17 15:23:12
【问题描述】:
我有一个带有自动生成列的 WPF 4.0 DataGrid。我只想允许用户编辑第一列。有没有简单的方法可以做到这一点?
我试图添加一个 DataGridCell 样式并根据 ColumnName(第一列始终具有相同的名称)或 ColumnIndex 设置它的编辑能力,但是我无法为此找出正确的 XAML,或者即使它是可能的。
【问题讨论】:
我有一个带有自动生成列的 WPF 4.0 DataGrid。我只想允许用户编辑第一列。有没有简单的方法可以做到这一点?
我试图添加一个 DataGridCell 样式并根据 ColumnName(第一列始终具有相同的名称)或 ColumnIndex 设置它的编辑能力,但是我无法为此找出正确的 XAML,或者即使它是可能的。
【问题讨论】:
下面的示例可以解决一列或多列
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
}
}
【讨论】:
每一列都有一个IsReadOnly 属性。此外,整个 DataGrid 也有 IsReadOnly [这不会影响绑定,只是用户编辑字段的能力]
编辑: 急忙回答,不好意思。我只能猜测,如果可能的话,你不应该自动生成列,这样你就可以控制哪些是只读的,哪些 controltemplate 去哪里......只需使用列的 Binding 属性,这样你就不需要自动生成它们。
【讨论】:
我明白了....这是我用的:
<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 引用,但至少它可以工作:)
【讨论】:
private void dgTableDetailAdj_RowEditEnding(对象发送者,DataGridRowEditEndingEventArgs e)
{
foreach(dgTableDetailAdj.Columns 中的 DataGridColumn col)
{
if (col.Header.Equals("columnName"))
{
col.IsReadOnly = true;
}
}
}
【讨论】: