none
WPF + Datagrid + Coluna Calculada + EntityFramework + ObservableCollection RRS feed

  • Pergunta

  • Amigos, bom dia.

    Tenho uma tabela no meu entityframework chamada "nota", com os campos n1, n2.

    Preciso jogar isso num datagrid, com um terceiro campo (media) contendo a media das colunas n1 e n2, ou seja, uma coluna calculada.

    O Datagrid precisa ser editavel no n1 e no n2, a medida q eu faço as alterações (no momento da digitação) elas são automaticamente refletidas na coluna media.

    Já rodei essa web inteira, achei muita coisa sobre observableCollection mas achei as implementações complicadas e não entendi como poderia aplicá-las nesse meu simples cenário.

    Açguém poderia me dizer como posso fazer esse datagrid wpf funcionar?


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    sexta-feira, 22 de maio de 2015 14:43

Respostas

  • Amigo vou te mostrar de uma forma simples para vê como é o funcionamento lembrando que sempre pode ser melhorado, estarei postando da maneira mais simples.

    primeiramente vamos adicionar no xaml nosso componente DataGrid e suas respectivas colunas e Bindings

    <Grid>
        <DataGrid ItemsSource="{Binding Notas}" AutoGenerateColumns="False">
              <DataGrid.Columns>
                 <DataGridTextColumn Header="N1" Width="*" Binding="{Binding N1, UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTextColumn Header="N2" Width="*" Binding="{Binding N2, UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTextColumn Header="N2" Width="*" Binding="{Binding Resultado, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
             </DataGrid.Columns>
        </DataGrid>
    </Grid>


    Vamos criar agora uma classe que contenha as propriedades "N1", "N2" e Resultado, essa classe deve implementar a Interface INotifyPropertyChanged para notificar as mudanças no nosso xaml.
    "Lembrando que deve pesquisar a Interface para poder entender melhor seu funcionamento"

    public class Infor : INotifyPropertyChanged
    {
        private decimal _N1;
    
        public decimal N1
        {
            get { return _N1; }
            set
            {
                _N1 = value;
                OnPropertyChanged("Resultado");
            }
        }
    
         private decimal _N2;
    
         public decimal N2
         {
            get { return _N2; }
            set
            {
                _N2 = value;
                OnPropertyChanged("Resultado");
            }
        }
    
        public decimal Resultado { get { return (N1 + N2) / 2; } }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

    Podemos notar que nas propridades "N1" e "N2" estou chamando o Evento "OnPropertyChanged" passando a propriedade "Resultado" como parametro. toda vez que for realizado uma alteração nos valores N1 ou N2, sera realizado o calculo que consta na propriedade Resultado.

    Voltando para nosso formulario iremos criar uma Lista ObservableCollection da nossa classe Infor e vincularemos ao nosso xaml lembrando que essa classe deve ser do mesmo nome informado no nosso ItemsSorce do no DataGrid Notas

    public partial class MainWindow : Window
    {
        private ObservableCollection<string> _Lista = new ObservableCollection<string>();
    
        public ObservableCollection<string> Lista
        {
            get { return _Lista; }
            set { _Lista = value; }
        }
    
        private ObservableCollection<Infor> _Notas = new ObservableCollection<Infor>() ;
            
        public ObservableCollection<Infor> Notas
        {
            get { return _Notas ; }
            set { _Notas  = value; }
        }
            
    
        public MainWindow()
        {
            InitializeComponent();
            Notas.Add(new Infor() { N1 = 0, N2 = 0 });
               
            this.DataContext = this;
        }
    }

    espero que de certo qualquer duvida é só perguntar.


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    • Marcado como Resposta Tianodraco segunda-feira, 25 de maio de 2015 16:30
    sábado, 23 de maio de 2015 22:28

Todas as Respostas

  • Ninguém?

    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    sábado, 23 de maio de 2015 11:55
  • Amigo vou te mostrar de uma forma simples para vê como é o funcionamento lembrando que sempre pode ser melhorado, estarei postando da maneira mais simples.

    primeiramente vamos adicionar no xaml nosso componente DataGrid e suas respectivas colunas e Bindings

    <Grid>
        <DataGrid ItemsSource="{Binding Notas}" AutoGenerateColumns="False">
              <DataGrid.Columns>
                 <DataGridTextColumn Header="N1" Width="*" Binding="{Binding N1, UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTextColumn Header="N2" Width="*" Binding="{Binding N2, UpdateSourceTrigger=PropertyChanged}" />
                <DataGridTextColumn Header="N2" Width="*" Binding="{Binding Resultado, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
             </DataGrid.Columns>
        </DataGrid>
    </Grid>


    Vamos criar agora uma classe que contenha as propriedades "N1", "N2" e Resultado, essa classe deve implementar a Interface INotifyPropertyChanged para notificar as mudanças no nosso xaml.
    "Lembrando que deve pesquisar a Interface para poder entender melhor seu funcionamento"

    public class Infor : INotifyPropertyChanged
    {
        private decimal _N1;
    
        public decimal N1
        {
            get { return _N1; }
            set
            {
                _N1 = value;
                OnPropertyChanged("Resultado");
            }
        }
    
         private decimal _N2;
    
         public decimal N2
         {
            get { return _N2; }
            set
            {
                _N2 = value;
                OnPropertyChanged("Resultado");
            }
        }
    
        public decimal Resultado { get { return (N1 + N2) / 2; } }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }

    Podemos notar que nas propridades "N1" e "N2" estou chamando o Evento "OnPropertyChanged" passando a propriedade "Resultado" como parametro. toda vez que for realizado uma alteração nos valores N1 ou N2, sera realizado o calculo que consta na propriedade Resultado.

    Voltando para nosso formulario iremos criar uma Lista ObservableCollection da nossa classe Infor e vincularemos ao nosso xaml lembrando que essa classe deve ser do mesmo nome informado no nosso ItemsSorce do no DataGrid Notas

    public partial class MainWindow : Window
    {
        private ObservableCollection<string> _Lista = new ObservableCollection<string>();
    
        public ObservableCollection<string> Lista
        {
            get { return _Lista; }
            set { _Lista = value; }
        }
    
        private ObservableCollection<Infor> _Notas = new ObservableCollection<Infor>() ;
            
        public ObservableCollection<Infor> Notas
        {
            get { return _Notas ; }
            set { _Notas  = value; }
        }
            
    
        public MainWindow()
        {
            InitializeComponent();
            Notas.Add(new Infor() { N1 = 0, N2 = 0 });
               
            this.DataContext = this;
        }
    }

    espero que de certo qualquer duvida é só perguntar.


    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    • Marcado como Resposta Tianodraco segunda-feira, 25 de maio de 2015 16:30
    sábado, 23 de maio de 2015 22:28
  • Obrigado cara!

    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    segunda-feira, 25 de maio de 2015 16:30