Binding de objetos complexos (bind complex objects)

6 views
Skip to first unread message

mrbar2000

unread,
Mar 25, 2009, 1:35:21 PM3/25/09
to Infra - Integrated Frameworks
Oi pessoal, venho pensando em como fazer binding de objetos mais
complexos como combox, listbox, listview.

Estava pensando em termos interfaces diferentes para tratamento de
listas (BindingList e BindableList)

// temos infraobject instanciado chamado pessoa e possui uma atributo
IEnderecos (Infralist) chamada endereços.

bm := BindingService.GetNewBindManager;
bm.DataContext := pessoa;

// Amarrando Nome ao Edit
bm.Add('Nome', Edit1, 'Text').TwoWay;

// Amarrando Endereços da pessoa a um ListBox
bl := bm.Add('Enderecos', ListBox1, 'Items');
(bl as IBindingList).Items.Add('Rua');

// Amarrando Endereços da pessoa a um Listview
bl := bm.Add('Enderecos', ListView1, 'Items');
with (bl as IBindingList).Items do
begin
Add('Rua');
Add('Numero', TNumerToTextConverter.Create);
Add('Cidade.Nome');
end;

o que acham?

------------------------

Hi Guys, I thinking about how binding of more complex objects as
combox, listbox, listview.

I was thinking in different interfaces for lists treatment
(BindingList and BindableList)

/ / We have instantiated infraobject named person and has a IAddresses
attribute (Infralist) call Addresses.

bm: = BindingService.GetNewBindManager;
bm.DataContext: = person;

/ / Name Tied to Edit
bm.Add( 'Name', Edit1, 'Text'). TwoWay;

/ / Address of the person tying a ListBox
bl: = bm.Add( 'Addresses', ListBox1, 'Items');
(bl the IBindingList).Items.Add('Street');

/ / Address of the person tying a ListView
bl: = bm.Add ('Addresses', ListView1, 'Items');
with (bl as IBindingList).Items do
begin
Add('street');
Add('Number', TNumerToTextConverter.Create);
Add('City.Name');
end;

what do you think?

mrbar2000

unread,
Mar 28, 2009, 5:24:28 PM3/28/09
to Infra - Integrated Frameworks
Obrigado pelas inúmeras respostas, fico muito agradecido pelas
leituras pessoal :D

Fiquei pensando durante toda a semana sobre o binding de objetos
complexos. E cheguei a seguinte conclusão

Acredito que precisamos quebrar a interface de binding ou fazer uma
herança dela, criando o IBindingList este teria a propriedade Columns
que seria outro IBinding.

Então por exemplo, para combo e listbox poderiamos fazer o binding
assim:

bm.datacontext := PessoaViewModel;
bl := bm.AddList( 'Enderecos', ListBox1, 'Items',
TListItemPropertyToText.Create);
bl.ConverterParameter := TInfraString.NewFrom('Rua');

TListItemPropertyToText é um converter que sabe como pegar um objeto
da lista Enderecos que está no PessoaViewModel e pegar a propriedade
rua deste objeto.

Algum de voces poderia dizer que talvez em vez de aparecer o nome da
rua queria uma concatenação no estilo:

'Rua Tiradentes, 13, São Paulo' -> concatenação da rua, numero e nome
da cidade.

E ai é que o Converter definido no AddList ganha mais significado. O
programador poderia criar seu próprio converter

bl := bm.AddList( 'Enderecos', ListBox1, 'Items',
TEnderecoToText.Create);
bl.ConverterParameter := TInfraString.NewFrom
('Rua;Numero;Cidade.Nome');

Bem, para o listbox não foi necesário usar a propriedade Columns. Mas
se quisermos usar grids ou listviews precisariamos. Então pensei no
seguinte:

bl := bm.AddList('Enderecos, Listview1, 'Items');
bl.Columns.Add('Rua');
bl.Columns.Add('Numero', TNumeberToText.Create);
bl.Columns.Add('Cidade.Nome');

E aí tá ficando melhor? simples esta abordagem?

No próximo post estarei declarando o que penso sobre um esquema de
master-detalhe por exemplo.

mrbar2000

unread,
Apr 5, 2009, 10:37:21 AM4/5/09
to Infra - Integrated Frameworks
Só uma correção ao post anterior, onde se lê:

> bl := bm.AddList( 'Enderecos', ListBox1, 'Items', TEnderecoToText.Create);
> bl.ConverterParameter := TInfraString.NewFrom('Rua;Numero;Cidade.Nome');

Na verdade pelo fato de TEnderecoToText ser criado pelo programador,
internamente ele poderia pegar todos os atributos que precisasse
apresentar e concatenar em uma string (endereço completo). ficaria
mesmo somente:
Reply all
Reply to author
Forward
0 new messages