Ir para o conteúdo
saramgsilva

WPF - Dúvida

Mensagens Recomendadas

saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
saramgsilva    2
saramgsilva

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade