2009-10-06 4 views
1

Я недавно использовал привязку данных в 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 находится внутри lib, поэтому я не хочу размещать там какие-либо объекты привязки, поскольку я чувствую, что это должно быть gui. С другой стороны, с привязкой, мой gui взял полный контроль над моей коллекцией.

ответ

1

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

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

+0

Спасибо, это очень хорошая информация. Я немного заинтересован в том, чтобы указать свой внутренний список как BindingList, поскольку я чувствую, что ему не нужно знать, как он будет использоваться. Но я полагаю, что альтернативой будет некоторый промежуточный уровень конвертирования, что на самом деле не стоит для небольшого проекта. – DanDan

+0

'BindingList' предназначен для презентации-агностик. Все это обеспечивает необходимую инфраструктуру для обнаружения изменений. Независимо от того, какой сценарий привязки данных WHAT используется, * в системе * есть * система отслеживания изменений (или, точнее, * уведомление об изменении уведомлений), чтобы изменения в данных автоматически отражались в графическом интерфейсе. Нет ничего «вонючего» в использовании 'BindingList '. –

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