Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
1h 11m 40s
Na Lição 22 da série de Aplicativos C# do Início ao Fim, Tim Corey começa a trabalhar no formulário de Visualização de Torneios, focando fortemente na vinculação de dados do WinForms. Tim explica que esta aula não é sobre salvar dados para bancos de dados ou arquivos de texto — isso virá mais tarde. Em vez disso, o objetivo inteiro deste vídeo é conectar a UI, popular controles e entender como os dados se movem entre modelos e controles WinForms usando vinculação de dados.
Tim deixa claro que a vinculação de dados WinForms pode parecer desajeitada, confusa e às vezes frustrante. Por causa disso, esta lição se torna uma caminhada profunda e prática sobre como a vinculação de dados realmente se comporta, o que a quebra e como corrigi-la. Seguindo a jornada de depuração de Tim, obtemos uma compreensão realista e valiosa dos mecanismos de vinculação do WinForms.
Tim começa descrevendo o que o formulário de Visualização de Torneio deve fazer. O formulário exibe:
O nome do torneio
Um menu suspenso que contém rodadas de torneios
Uma caixa de lista mostrando confrontos para a rodada selecionada
Nomes de equipe e pontuações para o confronto selecionado
Tim enfatiza que todas essas informações devem permanecer sincronizadas. Quando uma rodada muda, os confrontos devem ser atualizados. Quando um confronto muda, os nomes das equipes e as pontuações devem ser atualizados. Este requisito conduz toda a discussão em torno da vinculação de dados. Os controles vinculados à mesma fonte de dados, também conhecidos como controles vinculados a dados, permanecem em sincronia automaticamente. O controle BindingNavigator lida com a vinculação aos dados mantendo o ponteiro para o item na lista de registros atual. A classe CurrencyManager gerencia uma coleção de vinculações entre controles de lista e um objeto de fonte de dados, permitindo rastreamento de posição e notificações de alteração. Cada controle vinculado, como um TextBox ou Label, está ligado à fonte de dados através desses mecanismos para garantir a sincronização automática.
Tim explica que o formulário de Visualização de Torneio não deve decidir qual torneio carregar. Essa responsabilidade pertence ao painel. Portanto, o formulário de Visualização de Torneio deve receber um TournamentModel através de seu construtor.
Ele mostra como o objeto torneio passado está armazenado em um campo privado no nível do formulário, tornando-o acessível a todos os métodos no formulário. Este objeto de torneio se torna a única fonte de verdade para todas as operações de vinculação de dados. Na vinculação de dados simples, um controle pode ser vinculado a um único elemento de dados, como um valor de uma única tabela de dados, permitindo que você exiba ou edite pontos de dados individuais. O BindingSource pode ser usado em cenários de vinculação simples e complexa.
Tim apresenta um método privado chamado LoadFormData. Este método puxa dados do modelo de torneio e os empurra para os controles da UI.
Por exemplo:
Tim destaca que esta é a forma mais simples de vinculação de dados — atribuir valores manualmente — e é um bom ponto de partida antes de lidar com listas e coleções. A vinculação simples conecta uma única propriedade de um controle a um único valor em uma fonte de dados e exibe normalmente um registro por vez.
Tim percorre a modificação do painel para que, quando um usuário selecionar um torneio e clicar em "Carregar Torneio", o formulário de Visualização de Torneios seja aberto.
Aqui, Tim lança o item selecionado do menu suspenso para um TournamentModel e o passa para o formulário de visualização. Ele confirma que a fiação funciona executando o aplicativo e vendo o nome do torneio aparecer corretamente.
Isso confirma que a passagem básica de objetos e as atualizações da UI estão funcionando antes de avançar para a vinculação de listas.
Agora Tim passa para a vinculação de listas, começando com rodadas de torneios.
Ele explica que as rodadas são melhor representadas como uma lista de inteiros, não strings. Tim diz explicitamente que essa escolha facilita a vida porque:
Inteiros se vinculam bem a menus suspensos
Inteiros podem ser recuperados sem análise de string
O valor selecionado pode ser lançado diretamente de volta para um int
Um controle ComboBox pode ser vinculado a uma tabela ou lista definida, permitindo que você exiba e selecione dados de forma eficiente. Ao vincular um controle ComboBox, você pode usar a propriedade DisplayMember para especificar qual campo é mostrado ao usuário e a propriedade ValueMember para determinar qual campo é usado como o valor subjacente. Semelhantemente, você pode vincular o controle DataGridView às informações contidas em uma tabela de dados.
Tim percorre as rodadas do torneio, extrai números de rodadas únicos e os armazena em uma lista.
Tim apresenta a primeira regra importante de vinculação do WinForms:
Sempre defina o DataSource como nulo antes de redefini-lo.
Ele limpa a fonte de dados do menu suspenso, em seguida, atribui a lista de rodadas a ela. Quando você vincula um controle a uma fonte de dados, se a fonte de dados implementar interfaces como INotifyCollectionChanged, o controle refrescará automaticamente sua UI quando os dados mudarem. Isso garante sincronização em tempo real entre os dados e sua representação visual. Além disso, mudanças no controle de UI ou na fonte de dados subjacente atualizam automaticamente o outro extremo da vinculação com base na configuração (unidirecional ou bidirecional). Como inteiros se convertem naturalmente em strings, ele explica que nenhum DisplayMember é necessário aqui.
Tim então demonstra um erro comum — esquecer de chamar o método de carregamento — e mostra como perder uma única chamada de método resulta em um menu suspenso vazio.
Tim explica que o WinForms depende muito de eventos, especialmente SelectedIndexChanged.
Ele conecta o evento SelectedIndexChanged do menu suspenso de rodadas a um método que carrega confrontos para a rodada selecionada. Na vinculação de dados do WinForms, um manipulador de eventos recebe o parâmetro object sender, que identifica qual controle acionou o evento. Você pode lidar com os seguintes eventos, como Formatar e Analisar, para personalizar a formatação de dados e validação; os eventos Formatar e Analisar da classe Binding permitem formatação especial e validação de dados durante o processo de vinculação de dados. Outros controles também podem ser vinculados e sincronizados através de manipulação de eventos semelhante.
Tim prefere extrair a lógica em métodos auxiliares privados, em vez de colocar o código diretamente nos manipuladores de eventos. Ele explica que isso mantém o código reutilizável e limpo.
Tim recupera a rodada selecionada lançando o item selecionado do menu suspenso de volta para um inteiro.
Ele percorre as rodadas do torneio novamente, mas dessa vez filtra os confrontos onde a rodada do confronto é igual à rodada selecionada. Esses confrontos são colocados em uma lista de confrontos selecionados, que se torna a fonte de dados para a caixa de lista de confrontos.
Isso introduz o desafio de vincular listas de objetos complexos.
Tim explica que o modelo de confronto não tem uma representação de string natural apropriada para exibição na UI.
Em vez de forçar lógica na UI, Tim adiciona uma propriedade de nome de exibição de leitura apenas ao modelo. Esta propriedade constrói uma string como:
Equipe A vs. Equipe B
Se uma equipe estiver faltando (semana de folga ou rodada futura), Tim retorna:
Confronto ainda não determinado
Controles vinculados complexos, como DataGridView, suportam cenários de vinculação complexos onde vários elementos de dados de uma tabela de dados ou outras estruturas podem ser exibidos e editados. A vinculação de dados complexos permite vincular mais de um elemento de dados a um controle, como vincular várias colunas ou linhas da fonte de registros subjacente. ADO.NET fornece muitas estruturas de dados adequadas para vinculação, incluindo DataTable, DataView e outras estruturas, e o Windows Forms suporta vinculação a várias fontes de dados. A classe de vinculação gerencia a ligação lógica entre campos da fonte de dados e propriedades de controle, e interfaces como IBindingList, IEditableObject e INotifyPropertyChanged fornecem suporte a ordenação, notificação de alterações e recuperação. Você pode definir filtros padrão em exibições de dados para controlar como os dados são exibidos, e o contexto de vinculação e o CurrencyManager determinam como os controles vinculados a dados são sincronizados. A propriedade BindingContext de um Windows Form gerencia os objetos CurrencyManager para o formulário e cada fonte de dados tem um único objeto CurrencyManager, que mantém todos os controles vinculados à mesma fonte de dados em sincronia. Controles personalizados podem ser criados em Windows Forms que se comportam como controles padrão vinculados a dados, implementando as interfaces de vinculação necessárias.
Este é um princípio chave de vinculação de dados do WinForms que Tim enfatiza:
O modelo deve decidir como é exibido — não a UI.
Tim encontra múltiplos bugs:
Rodada dois não exibida corretamente
Confrontos não estão sendo atualizados
Eventos disparando inesperadamente
Em vez de esconder esses problemas, Tim percorre cada etapa de depuração. Ele explica como a vinculação se quebra quando listas são substituídas, mesmo que a nova lista contenha dados válidos.
Isso leva a uma lição crítica do WinForms.
O código a seguir demonstra como lidar com os eventos Formatar e Analisar da classe de Binding para fornecer formatação especial e validação durante o processo de vinculação de dados. O evento de formato e o evento de análise podem ser usados para personalizar como os dados são convertidos e validados entre a UI e a fonte de dados.
Tim experimenta com BindingSource, colocando-o entre o controle de UI e os dados. Ele explica como isso costumava ser a abordagem recomendada, mas admite que introduz complexidade e confusão. O componente BindingSource atua como um proxy entre uma fonte de dados e os controles Windows Forms, e trabalha com várias estruturas de dados adequadas para vinculação, como DataTables, DataViews, BindingLists e arrays.
Ele então introduz o BindingList, explicando que ele atualiza automaticamente os controles vinculados quando a lista muda. Se a fonte de dados implementar as interfaces apropriadas, como INotifyCollectionChanged, a vinculação de dados no Windows Forms suporta atualizações automáticas dos controles quando os dados subjacentes mudam.
No entanto, Tim descobre uma regra crucial:
Você NÃO deve substituir uma BindingList por uma nova.
Em vez disso, você deve:
Limpar a BindingList existente
Adicionar itens de volta a ela
Substituir a lista quebra a conexão de vinculação.
Tim confirma a causa raiz do problema de vinculação:
Atribuir novo BindingList() desconecta a UI
Limpar e readicionar itens preserva a vinculação
Ele atualiza tanto as rodadas quanto os confrontos para usar esse padrão. Uma vez aplicado consistentemente, a IU finalmente atualiza corretamente.
Tim explica que WinForms não dispara automaticamente SelectedIndexChanged quando os itens são carregados.
Para corrigir isso, ele manualmente:
Carrega os confrontos da rodada 1 após carregar as rodadas
Seleciona o primeiro confronto programaticamente
Isso garante que a IU seja inicializada corretamente sem exigir interação do usuário.
Ao final da lição, Tim confirma:
As rodadas atualizam corretamente
Os confrontos atualizam corretamente
Os nomes das equipes e pontuações carregam corretamente
Semanas de folga e rodadas futuras exibem texto significativo
Ele enfatiza que esta lição não era sobre perfeição, mas sobre entender como a vinculação de dados do WinForms realmente se comporta, incluindo suas limitações.
Tim termina explicando que a pontuação e filtragem (como 'somente não jogados') serão tratadas na próxima lição, quando houver mudanças reais de estado para trabalhar.
A Lição 22 é uma aula magistral em vinculação de dados prática no WinForms, não porque tudo funciona perfeitamente, mas porque Tim Corey passa por cada falha, correção e decisão de design em tempo real.
Ao seguir o vídeo de Tim, os desenvolvedores ganham uma compreensão realista de:
Por que a vinculação de WinForms parece frágil
Como funciona o BindingList
Por que limpar listas é importante
Como a IU e os modelos devem interagir
Se você já lutou com vinculação de dados no WinForms, esta lição e as explicações de Tim fazem o 'porquê' finalmente fazer sentido.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy