Lista <T> vs BindingList <T> Vantagens / Desvantagens

91

Alguém pode descrever qual a diferença entre os dois para o meu projeto.

Atualmente eu tenho um List<MyClass>e defina o BindingSource para aquele e um DataGridView para o BindingSource.

Implementei IEditableObjectentão, quando CancelEdit é chamado, eu reverto meu objeto de volta ao que era com umMemberwise.Clone()

Mudar minha lista para um BindingList resolverá isso e quais são as vantagens de usar um BindingList?

Jon
fonte

Respostas:

123

A List<>é simplesmente uma matriz de redimensionamento automático, de itens de um determinado tipo, com algumas funções auxiliares (por exemplo: classificar). São apenas os dados, e é provável que você os use para executar operações em um conjunto de objetos em seu modelo.

A BindingList<>é um wrapper em torno de uma lista digitada ou uma coleção, que implementa a IBindingListinterface. Esta é uma das interfaces padrão que suportam ligação de dados bidirecional. Ele funciona implementando o ListChangedevento, que é gerado quando você adiciona, remove ou define itens. Os controles vinculados ouvem esse evento para saber quando atualizar sua exibição.

Quando você define um DataSource de BindingSource como a List<>, ele cria internamente um BindingList<>para agrupar sua lista. Você pode querer pré-empacotar sua lista com um BindingList<>você mesmo se quiser acessá-la fora do BindingSource, mas caso contrário, é a mesma coisa. Você também pode herdar de BindingList<>para implementar um comportamento especial ao alterar itens.

IEditableObjecté manipulado pelo BindingSource. Ele chamará BeginEdit em qualquer objeto de implementação quando você alterar os dados em qualquer controle vinculado. Você pode então chamar EndEdit / CancelEdit no BindingSource e ele irá repassá-lo ao seu objeto. Mover para uma linha diferente também chamará EndEdit.

Alex J
fonte
Atualmente com a minha abordagem List <T>, chamar CancelEdit não retornará o item que está sendo editado de volta ao seu estado original, por isso uso Clone (). Você está dizendo que uma lista de vinculação cuidará disso para mim?
Jon
3
Não, um BindingList não tem nada a ver com essa funcionalidade. O BindingSource simplesmente chama CancelEdit no objeto atual, independentemente do tipo de lista subjacente. Não há nada na estrutura que implemente automaticamente o controle de versão de objetos para objetos simples. Você pode usar DataTables / DataRows, que mantém uma cópia original dos dados apenas para esse propósito.
Alex J de
Você diz que os controles precisam saber quando a lista muda, você pode explicar melhor? Eu tenho um formulário com um datagridview e outro formulário com dados populados. Eu preciso me preocupar com o que você está dizendo sobre esse assunto?
Jon
Por exemplo, o DataGrid precisa saber quando os itens são adicionados à sua lista para adicionar uma nova linha. Para isso utiliza o evento ListChanged da BindingList. Se você estivesse vinculando a grade diretamente a um List <T>, você não teria o evento, e a grade não seria capaz de saber quando você alterou a lista. Você não precisa se preocupar com isso em seu cenário porque o BindingSource envolve o List <T> em um BindingList para você. Contanto que você trabalhe com BindingSource e não com a lista em si, os controles permanecerão sincronizados.
Alex J
Existe alguma solução alternativa para usar BindingList para WPF UI (a maneira mvvm)? Posso agrupar a lista de vinculação em uma coleção observável?
Lance de
12

Um BindingList permite a ligação de dados bidirecional usando eventos, um List não dispara eventos quando sua coleção muda.

Não acho que isso resolverá seu problema específico.

Gerrie Schenck
fonte