1

我正在绑定到 Xceed DataGridControl(社区版)AutoCreatedColumns

ObservableCollection<ItemViewModel> Items

我想ReadOnly根据Editableviewmodel 属性上的属性标记创建的列的属性。

 class ItemViewModel : ViewModelBase {

     [Editable(false)] 
     public string Id { get; set; }

     string _comment;
     [Editable(true)]
     public string Comment {
         get { return _comment; }
         set {
              _comment = value;
              NotifyOfPropertyChanged(() => Comment);
         }
     // Other properties ...

 }

这可能吗?还是有另一种方法可以挂钩到列的创建以检查正在绑定和以编程方式设置为只读的属性?

4

1 回答 1

1

我认为最佳解决方案是连接到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属性绑定到您的可编辑属性,如此所述。

如果您知道要显示哪些列,则可以简化上面的解决方案并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创建自己的集合)。DataGridCollectionViewSourceDataGridItemProperty.IsReadOnly

于 2014-01-15T15:44:10.993 回答