Элементы управления привязкой данных, лучшие практики для инкапсуляции - PullRequest
1 голос
/ 06 октября 2009

Я недавно использовал привязку данных в c #, и хотя способ, которым я это делаю, прост и работает, это не похоже на лучший способ.

Например, у меня есть класс менеджера, т.е. UserManager, который имеет следующий интерфейс:

class UserManager
{
  public IList<User> Users { get; ...}
  public AddUser(...)
  public RemoveUser(...)
}

Таким образом, Adduser и RemoveUser должны управлять списком с коллекцией Users в качестве вывода. Я использую эту коллекцию в привязке, а именно:

listBindingSource.DataSource = userManager.Users;

Затем я манипулирую списком через привязку, т.е.

listBindingSource.Add(new User(...))

Это работает, конечно, но я полностью игнорирую функции UserManager и AddUser / RemoveUser! Это, конечно, кажется очень неправильным. Как правильно использовать привязку данных?

UserManager находится внутри библиотеки, поэтому я не хочу помещать туда какие-либо обязательные объекты, так как считаю, что это должно быть графическим интерфейсом. С другой стороны, с привязкой мой графический интерфейс полностью контролировал мою коллекцию.

1 Ответ

1 голос
/ 06 октября 2009

Поскольку ваш код стоит сейчас, вы не можете делать то, что вы ищете. В какой-то момент коллекция должна поддерживать интерфейс IBindingList (что делает объект BindingSource в форме). Если вы хотите использовать свой класс UserManager для выполнения манипуляций, для практических целей вам придется изменить внутреннее хранилище данных для свойства Users на использование BindingList<User> (вы все равно сможете вернуть он набирается как IList<User>, как сейчас, просто измените фактическую конкретную реализацию на BindingList<User>). Выполнение этого откроет интерфейс IBindingList для сетки и обнаружит изменения, сделанные в другом месте, а именно в вашем классе UserManager.

Это, однако, приведет только к тому, что он обнаружит изменения, внесенные в список , а не в отдельные элементы, содержащиеся в списке (другими словами, добавления и удаления будут отражены в пользовательском интерфейсе, но модификаций не будет). Для этого вам необходимо реализовать IPropertyChanged в классе User (при условии, что это еще не сделано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...