1

Xceed DataGridControl (Community Edition) にバインドしていますAutoCreatedColumns

ObservableCollection<ItemViewModel> Items

ビューモデル プロパティの属性にReadOnly基づいて、作成された列のプロパティをマークしたいと思います。Editable

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

 }

これは可能ですか?または、列の作成にフックして、バインドされているプロパティを検査し、プログラムで ReadOnly を設定する別の方法はありますか?

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 に答える