1

Я хочу отобразить список самонаблюдений entities на форме, используя стандартный механизм привязки.Отображение списка объектов самоконтроля, их фильтрация по состоянию

Что я хочу, так это выбрать из списка список, изменить/добавить или удалить их, затем либо отправить изменения, либо отклонить их в зависимости от выбора пользователя.

Насколько я понимаю, для этого должен быть прикреплен список entities к контексту, тогда должен быть сделан вызов изменения принятия (или нет, если изменения должны быть отклонены). Это означает, что удаленные объекты также должны быть в списке, помечены как удаленные.

Однако они больше не должны отображаться. Это означает, что отображение должно быть отфильтровано по состоянию сущностей.

Теперь, чтобы сделать фильтрацию, я оберну свой список в BindingList и использую свойство Filter. С другой стороны, entites не сразу выставляют свою информацию (в отличие от типизированных строк данных) и удерживают их в ChangeTracker.State. Я теряю, как сделать фильтрацию в этом случае, особенно учитывая, что состояние - это перечисление, а не простой тип.

ответ

0

После некоторого обсуждения я обнаружил, что BindingList не поддерживает фильтрацию, и то же самое имеет значение для BindingSource.

Таким образом, при стандартной фильтрации из вопроса, я написал свою собственную реализацию, как это:

private class LivingBindingList : BindingList<Producer> 
{ 
    public LivingBindingList(List<Producer> source) 
     : base(source.Where(producer => producer.ChangeTracker.State != ObjectState.Deleted).ToList()) 
    { 
     rem_cache = source.Where(producer => producer.ChangeTracker.State == ObjectState.Deleted).ToList(); 
    } 
    List<Producer> rem_cache; 
    protected override void RemoveItem(int index) 
    { 
     this.Items[index].MarkAsDeleted(); 
     this.rem_cache.Add(this.Items[index]); 
     base.RemoveItem(index); 
    } 
    protected override void OnAddingNew(AddingNewEventArgs e) 
    { 
     e.NewObject = new Producer() 
     { 
      NameProducer = "Новый производитель", 
      GUID = Guid.NewGuid(), 
      Type = 1, 
      Note = String.Empty 
     }; 
     base.OnAddingNew(e); 
    } 
    internal IEnumerable<Producer> GetAllForSubmit() 
    { 
     return this.Items.Concat(rem_cache); 
    } 
} 

С этим я могу связать в список, добавлять и удалять столько, сколько я хочу, и OFR commit цели извлекают все записи, включая мертвые, с помощью GetAllForSubmit().

1

[Edit: удален первый раствор, состоящий в удалении сущностей из списка]

Вы можете добавить IsDeleted собственности к вашим лицам

public bool IsDeleted 
{ 
    get { 
     return ChangeTracker.State == ObjectState.Deleted 
    } 
} 

и фильтра на этой собственности. STE являются частичными классами и могут быть расширены

+0

спасибо! Ваш ответ дал мне толчок в правильном направлении – Srv19

Смежные вопросы