Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [VS2010 - C#] Aggiornare DataGridView WPF

    Ciao a tutti. Ho una form in WPF che contiente una DataGridView e un calendario con implementato il suo metodo calendario_SelectedDatesChanged come di seguito riportati:
    codice:
       
            <DataGrid AutoGenerateColumns="False" Grid.Row="1" Margin="0,46.86,0,8" Name="dgvAssentiOggi" ItemsSource="{Binding Assenze, Source={StaticResource accessoDati}}" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" d:LayoutOverrides="Width">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Nome Richiedente" Binding="{Binding NomeRichiedente}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Cognome Richiedente" Binding="{Binding CognomeRichiedente}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Data Compilazione" Binding="{Binding DataDiRichiesta, StringFormat=dd/MM/yyyy}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Ora inizio assenza" Binding="{Binding OraInizioAssenza, StringFormat=HH:mm}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Ora fine assenza" Binding="{Binding OraFineAssenza, StringFormat=HH:mm}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Permesso" Binding="{Binding Permesso, Converter={StaticResource boolToX}}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Ferie" Binding="{Binding Ferie, Converter={StaticResource boolToX}}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Malattia" Binding="{Binding Malattia, Converter={StaticResource boolToX}}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                    <DataGridTextColumn Header="Ritardo" Binding="{Binding Ritardo, Converter={StaticResource boolToX}}" CanUserReorder="False" CanUserResize="False" IsReadOnly="True" Width="Auto" />
                </DataGrid.Columns>
            </DataGrid>
            <Calendar Margin="450,12,0,0" Name="calendario" Height="168" VerticalAlignment="Top" HorizontalAlignment="Left" Width="195" SelectedDatesChanged="calendario_SelectedDatesChanged" />
    Poi ho questa classe per accedere ai dati del DB:
    codice:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections.ObjectModel;
    using System.Windows;
    using System.ComponentModel;
    
    namespace Permessi.ViewModels
    {    
        public class AccessoDati:INotifyPropertyChanged
        {
            private DateTime cambioData;
            private ObservableCollection<Assenze> assenze = null;
            public ObservableCollection<Assenze> Assenze
            {
                get 
                {
                    return this.assenze;
                }
                private set 
                {
                    this.assenze = value;
                }
            }        
    
            public AccessoDati() 
            {
                if (!MainWindow.IsInDesignMode())
                {
                    this.Assenze = new ObservableCollection<Assenze>();
                    this.AggiornaDati();
                }
            }                
    
            private void AggiornaDati()
            {           
                PermessiEntities context = new PermessiEntities();
                cambioData = new DateTime(MainWindow.dataSelezionata.Year, MainWindow.dataSelezionata.Month, MainWindow.dataSelezionata.Day);
                foreach (Assenze el in context.Assenzes)
                {
                    if(el.DataDiAssenza==cambioData)
                    {
                        this.Assenze.Add(el);                    
                    }                    
                }
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(string propertyName)
            {            
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }        
        }
    }
    che non è altro che la statitrosource alla quale faccio il Binding all'iterno della DataGridView.
    Quello che vorrei fare è aggiornare la datagridview quando vado a modificare la data all'interno del calendario semplicemente cliccando sul giorno. Come vedete ci sto provando e ho iniziato a implementare l'interfaccia INotifyPropertyChanged, ma non so proprio come andare avanti. Potreste aiutarmi? Grazie.

  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Ad occhio, per come stanno adesso le cose devi:

    1) chiamare NotifyPropertyChanged("Assenze") sia nel metodo setter di Assenze che alla fine del metodo AggiornaDati (dopo il foreach).

    2) richiamare il metodo AggiornaDati nell'eventHandler calendario_SelectedDatesChanged, dell'istanza dell'oggetto AccessoDati. Da codice dovresti poter accedere all'istanza con (this.Datacontext as AccessoDati).AggiornaDati() se il datacontext lo hai assegnato alla finestra (sostituisci this con l'oggetto che ha il datacontext).

    cosi a grandi linee dovrebbe funzionare pero stai facendo un mix di programmazione "vecchia maniera" e MVVM.

  3. #3
    Ciao e grazie per la risposta. In effetti mi sto affacciando solo ora all'MVVM e quindi sono agli inizi e oltretutto non ho trovato corsi buoni da seguire. Mi sapresti spiegare nel dettaglio dove c'è questo mix di cui mi parli? Comunque mi sono dimenticato di postare il codice della MainWindow:
    codice:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using Permessi.ViewModels;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    
    namespace Permessi
    {
        /// <summary>
        /// Logica di interazione per MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
    
            public static DateTime dataSelezionata;
            
            public MainWindow()
            {
                InitializeComponent();            
            }
    
            public static bool IsInDesignMode() 
            {
                return (bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue;
            }
    
            private void calendario_SelectedDatesChanged(object sender, SelectionChangedEventArgs e)
            {
                dataSelezionata = (DateTime)calendario.SelectedDate;
                
            }
        }
    }

  4. #4
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539

    rsdpzed ( ) ha ragione, stai facendo un mix... in MVVM aggiungere un handler nel code behind è concettualmente sbagliato. Dovresti aggiungere una proprietà nel tuo viewModel (ad esempio) di nome "DataSelezionata" e fare il binding con la SelectedDate del calendar nel tuo xaml, nel set di "DataSelezionata" chiami AggiornaDati() e NotifyPropertyChanged. A questo punto non serve più calendario_SelectedDatesChanged nel code behind, e tanto meno una proprietà statica che oltretutto in caso (ad esempio) di due form aperti sarebbe uguale per entrambi...


  5. #5
    Ok, adesso comincia ad essermi più chiaro...ci sbatto un po la testa e se ci sono problemi vi faccio sapere. Grazie a tutti.

    P.S.
    Conoscete qualche buon sito di corsi free per WPF?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.