• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

saramgsilva

WPF - Dúvida

15 mensagens neste tópico

Boas,

estou a desenvolver em WPF, e tenho uma questão que não consegui ainda resolver:

Suponhamos que tenho dois objectos:

Pessoa e Casa

Pessoa tem as seguintes propriedades:

string Nome

int Idade

e

Casa tem as seguintes propriedades:

Pessoa Dono

string Morada

Agora suponhamos que quero preencher uma listview em WPF, com uma colecção de casa:

o que faço é criar cada coluna usando o gridviewColumn

e depois atraves do listview.ItemsSource digo qual a colecção de casa

se eu quiser que a primeira coluna seja o valor de Dono.Name  como faço o bingind???

Para fazer o binding da morada eu sei fazer...

Cumprimentos

tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas, não é assim tão simples!

estas-me a dizer para fazer o seguinte

<GridViewColumn DisplayMemberBinding="{Binding Path=Dono.Nome}" Header="Nome do Dono" Width="100"/>

e acho que não esta correcto! é verdade que não testei...o que podia fazer no máximo seria

<GridViewColumn DisplayMemberBinding="{Binding Path=Dono\Nome}" Header="Nome do Dono" Width="100"/>

Mas não sei se posso, se fosse um XPath podia...agora sendo um Path :hmm:

Cumprimentos

Sara Silva

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, verdade seja dita, eu nunca usei isso. Normalmente crio os meus dataTemplates customisados em vez de usar o GridViewColumns. Mas penso que seja como disse anteriormente (é dessa forma que eu uso nos dataTemplates), acho que devias testar :P

Depois diz qualquer coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

não sei porque, mas acabei por fazer grande confusão talvez por pausa de poder definir XPath em que se usa a "\".

Tinhas razão é mesmo Path=Dono.Nome

já consegui fazer o exemplo que pretendia, e o fantástico é que com as ObservationCollection eu consigo trabalhar com apenas uma colecção, não preciso de ter uma copia na listview e quando altero algo, depois é reflectido na listview. eheheh :cheesygrin:

Vou aproveitar para colocar outras questões.

Eu não tenho muita prática em WPF, estou a iniciar, mas daquilo que li é boa prática as minhas classes implementarem a interface INotifyPropertyChanged, porque em alguns casos (ainda não consegui esclarecer mto bem quais) é muito útil.

Depois outra questão é sobre DependencyProperty:

eu não preciso de registar todas as propriedades?mas em que casos é que o devo fazer?

Cumprimentos

Sara Silva

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, eu não pesco muito de WPF (infelizmente, gostava de saber muito mais, já que é uma tecnologia muito porreira), mas vou dizer o pouco que sei.

Em relação ao INotifyPropertyChanged não faço a mínima ideia.

Em relação ao DependencyProperty, não precisas de registar todas as propriedades.

Por norma só registo as propriedades que faço binding no XAML e que posso alterar por código. Assim garanto que se houver animações/etc e que o valor dessa propriedade vai se alterando do lado código, essas alterações sejam sentidas no XAML.

Por exemplo, acho que é mais ou menos fácil acontecer o seguinte. Tens um teu dataTemplate que está a ser usado sobre um item. Os bindings são feitos no inicio, por exemplo a cor de uma border. Se depois por código alterares essa côr, muito provavelmente a côr da border continua a antiga, se essa propriedade não estiver registada.

Ou seja, se estiver a usar uma propriedade que é usada em binding algures, mas se pela lógica do programa esse valor não irá alterar, não registo. Se esse valor poder ser alteravel então registo, só numa de segurança.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas,

em relação ao DependencyProperty, não tinha essa ideia...apesar que achava que tinha a ver com os bindings.

Tenho que estudar mais sobre isto!  :P

WPF é muito mais poderoso em relação ao Windows Forms, e não me admira que Windows Forms venham a ficar para trás. Aquilo que senti em relação ao WPF é que "posso fazer o que quero e como quero", e digo isto porque tenho trabalho com interface com o utilizador, em que tenho desenvolvido os meus próprios controlos e por vezes encontrava dificuldades e pra utltrapassar isso tinha que estudar coisas a baixo nivel...mto complicado!

Outro exemplo é que WPF temos acesso a Controlos como a line, polyline, rectangle ....( a que salientar Controlos!) porque em WF conseguimos desenhar figuras geometricas numa form, por exemplo. Mas não temos esses controlos e o que aconteceu foi que os tive que criar, e foi extremamente complicado!

Cumprimentos

tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas,

tenho outra questão...

Eu estou a contruir as colunas da listview através de C#, dinamicamente, e queria definir para cada uma de que forma é que o conteúdo é alinhado.

Estava a tentar fazer como em Windows Form, mas penso que não posso...

Qualquer coisa relaccionado com datatemplate, deve resolver o assunto, não?

bom trabalho

tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

eu tenho um método onde crio um coluna da seguinte forma:


            GridViewColumn gridViewColumn = new SortableGridViewColumn();
            Binding binding = new Binding(MyBinding);       
            gridViewColumn.DisplayMemberBinding = binding;
            gridViewColumn.Header =MyLabel;
            gridViewColumn.Width = GetWidthByType(type);
          

O GetWidthByType(type) devolve um valor para o width da coluna consoante se é int, bool ou string...

Suponhamos que queria, para as colunas

            * de inteiros alinhar o conteúdo á direita

            * de boleanos alinhar ao centro

            * de string alinhar á esquerda

o que fazia em Windows Forms era


//...

ColumnHeader column = new ColumnHeader();
column.TextAlign = GetAlignment(type);

//....

private HorizontalAlignment GetAlignment(string type)
        {
            //define the alignment by type
            switch (type)
            {
                case "bool":
                    return HorizontalAlignment.Center;
                case "string":
                    return HorizontalAlignment.Left;
                case "int":
                    return HorizontalAlignment.Right;             
                case "float":
                    return HorizontalAlignment.Right;
                default:
                    return HorizontalAlignment.Left;
            }
        }

Espero ter sido mais clara.

Cumprimentos

Tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que a melhor forma seja mudares no template do cell.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

estou com outra dúvida  :P

Como é que insiro numa combobox um element que represente o valor null?

Cumprimentos

Tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

não estou a ver como poderia usar isso.

Eu tenho um user controlo onde estou a fazer a construção da combobox no código C#


            this.DataContext = _employee;
            
            ComboBox comboBox = new ComboBox();
            comboBox.Height = this.Height;
            comboBox.DisplayMemberPath = "Name"
            Binding binding = new Binding("Department");           
            binding.Mode = BindingMode.TwoWay;      
            binding.ValidatesOnDataErrors = true;         
            binding.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
            comboBox.SetBinding(ComboBox.SelectedValueProperty, binding);

            if (!AllowNull)
            {
                comboBox.ItemsSource = GetDepartments();
            }
            else
            {
                comboBox.Items.Add(string.Empty);
                foreach(Department dep in GetDepartments() )
                {
                    comboBox.Items.Add(dep );
                }
            }
            this.Children.Add( comboBox);

estava a inserir o comboBox.Items.Add(string.Empty); para ter um campo vazio na Combobox...mas acho que não faz sentido, mas não posso usar comboBox.Items.Add(null);

Cumprimentos

tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas,

penso que já discobri! Usei uma classe que implementa o IValueConverter e vou converter o string.empty para null :P e já deu! não sei se é a melhor politica!

cumprimentos

tofas

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora