Я считаю, что оптимальным решением является просто подключить к ItemsSourceChangeCompleted
события, как это:
void _dataGrid_ItemsSourceChangeCompleted(object sender, EventArgs e)
{
DataGridControl control = (DataGridControl)sender;
Type itemType = control.ItemsSource.GetType().GenericTypeArguments[0];
foreach (var col in control.Columns)
{
PropertyInfo propInfo = itemType.GetProperty(col.FieldName);
if (propInfo != null)
{
EditableAttribute editableAttribute = propInfo.GetCustomAttributes().OfType<EditableAttribute>().FirstOrDefault();
col.ReadOnly = (editableAttribute == null || !editableAttribute.Value);
}
else
{
col.ReadOnly = false;
}
}
}
В качестве альтернативы, вы можете связать свойство клеток ReadOnly
к редактируемом атрибута, как описано here.
Если вы знаете, какие столбцы вы хотите отобразить вы могли бы упростить решение выше и связать Колонном ReadOnly
свойство как это:
public class EditableConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null)
{
PropertyInfo propInfo = value.GetType().GenericTypeArguments[0].GetProperty(parameter.ToString());
if (propInfo != null)
{
EditableAttribute editableAttribute = propInfo.GetCustomAttributes().OfType<EditableAttribute>().FirstOrDefault();
return (editableAttribute == null || !editableAttribute.Value);
}
}
return false;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="Id"
ReadOnly="{Binding RelativeSource={RelativeSource Self},
Path=DataGridControl.ItemsSource,
Converter={StaticResource EditableConverter}, ConverterParameter=Id}" />
<xcdg:Column FieldName="Comment"
ReadOnly="{Binding RelativeSource={RelativeSource Self},
Path=DataGridControl.ItemsSource,
Converter={StaticResource EditableConverter}, ConverterParameter=Comment}" />
</xcdg:DataGridControl.Columns>
Но тогда, вы можете также отключить AutoCreateColumns
и определить Columns
самостоятельно в коде (или выключите AutoCreateItemProperties
и создайте свой собственный DataGridCollectionViewSource
, где вы установили каждый DataGridItemProperty.IsReadOnly
соответственно).
Спасибо! В этом случае я закончил жесткое кодирование столбцов в XAML, но это хорошая информация для будущего! –