public LayoutViewColumn AddColumn(ColumnInfoNodeWrapper columnInfo) {
     if (columnsProperties.ContainsValue(columnInfo.PropertyName)) {
         throw new ArgumentException(string.Format(SystemExceptionLocalizer.GetExceptionMessage(ExceptionId.GridColumnExists), columnInfo.PropertyName), "ColumnInfo");
     }
     ColumnInfoNodeWrapper frameColumn = Model.Columns.FindColumnInfo(columnInfo.PropertyName);
     if (frameColumn == null) {
         Model.Columns.Node.AddChildNode(columnInfo.Node);
     }
     LayoutViewColumn column = new LayoutViewColumn();
     columnsProperties.Add(column, columnInfo.PropertyName);
     LayoutView.Columns.Add(column);
     CustomCreateColumnEventArgs customArgs = new CustomCreateColumnEventArgs(column, columnInfo, repositoryFactory);
     OnCustomCreateColumn(customArgs);
     if (!customArgs.Handled) {
         IMemberInfo memberDescriptor = XafTypesInfo.Instance.FindTypeInfo(ObjectType).FindMember(columnInfo.PropertyName);
         if (memberDescriptor != null) {
             column.FieldName = memberDescriptor.BindingName;
             if (memberDescriptor.MemberType.IsEnum) {
                 column.SortMode = ColumnSortMode.Value;
             } else if (!SimpleTypes.IsSimpleType(memberDescriptor.MemberType)) {
                 column.SortMode = ColumnSortMode.DisplayText;
             }
             if (SimpleTypes.IsClass(memberDescriptor.MemberType)) {
                 column.FilterMode = ColumnFilterMode.DisplayText;
             } else {
                 column.FilterMode = ColumnFilterMode.Value;
             }
         } else {
             column.FieldName = columnInfo.PropertyName;
         }
         RefreshColumn(columnInfo, column);
         if (memberDescriptor != null) {
             if (repositoryFactory != null) {
                 RepositoryItem repositoryItem = repositoryFactory.CreateRepositoryItem(false, new DetailViewItemInfoNodeWrapper(columnInfo.Node), ObjectType);
                 if (repositoryItem != null) {
                     grid.RepositoryItems.Add(repositoryItem);
                     column.ColumnEdit = repositoryItem;
                     column.OptionsColumn.AllowEdit = IsDataShownOnDropDownWindow(repositoryItem) ? true : editMode != EditMode.ReadOnly;
                     repositoryItem.ReadOnly |= editMode != EditMode.Editable;
                     if ((repositoryItem is ILookupEditRepositoryItem) && ((ILookupEditRepositoryItem)repositoryItem).IsFilterByValueSupported) {
                         column.FilterMode = ColumnFilterMode.Value;
                     }
                 }
             }
             if ((column.ColumnEdit == null) && !typeof(IList).IsAssignableFrom(memberDescriptor.MemberType)) {
                 column.OptionsColumn.AllowEdit = false;
                 column.FieldName = GetDisplayablePropertyName(columnInfo.PropertyName);
             }
         }
     }
     OnColumnCreated(column, columnInfo);
     return column;
 }
 protected virtual void OnCustomCreateColumn(CustomCreateColumnEventArgs args) {
     if (CustomCreateColumn != null) {
         CustomCreateColumn(this, args);
     }
 }