Usuário com melhor resposta
WPF + Datagrid + Coluna Calculada + EntityFramework + ObservableCollection

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.
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
Todas as 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
-