質問

AutoCreatedColumns

でXceed DataGridControl(Community Edition)にバインドしています。
ObservableCollection<ItemViewModel> Items
.

ViewModelプロパティの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 ...

 }
.

これは可能ですか?または、拘束されているプロパティを検査するための列の作成にフックすることができるもう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;
        }
    }
}
.

あるいは、説明されているように、Cell ReadOnlyプロパティを編集可能な属性にバインドすることもできます。a>。

表示したい列がわかっている場合は、上記のソリューションを簡素化し、列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を適切に設定した状態で)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top