Domanda

Sono in una situazione in cui vengo informato da una fonte esterna che una particolare entità è stata modificata al di fuori del mio attuale datacontesto. Sono in grado di trovare l'entità e chiamare refresh in questo modo

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, myEntity);

e le proprietà che sono state modificate sull'entità vengono aggiornate correttamente. Tuttavia, nessuna delle INotifyPropertyChanging INotifyPropertyChanged sembra essere sollevata quando si verifica l'aggiornamento e questo lascia la mia interfaccia utente che mostra informazioni errate.

Sono consapevole che Refresh () non riesce a utilizzare i getter e i setter di proprietà corretti sull'entità per generare gli eventi di notifica delle modifiche, ma forse esiste un altro modo per ottenere lo stesso risultato?

Sto facendo qualcosa di sbagliato? Esiste un metodo migliore di Aggiorna? Se Aggiorna è l'unica opzione, qualcuno ha un problema?

È stato utile?

Soluzione

Ho avuto un problema simile. Stavo vincolando a TreeView e avevo bisogno di chiamare Aggiorna in risposta all'utente che annullava un'operazione di modifica. Il metodo Refresh () ripristina obbedientemente tutti i valori originali, ma ciò non si è riflesso nell'interfaccia utente di TreeView. Dopo essermi consultato con l'onnipotente Google, mi sono imbattuto in questa soluzione:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();

Questo sembra forzare il mio TreeView ad aggiornare tutto. L'unico inconveniente (ed è piuttosto importante) è che sembra comprimere tutti i nodi dell'albero, facendo perdere all'utente il proprio posto. Potrei anche impostare il mio ItemsSource su null e viceversa ... stesso effetto, anche se questo metodo sarebbe più semplice se avessi un mucchio di caselle di testo associate o qualcosa del genere, dal momento che non avresti bisogno per ricollegare tutti.

C'è una soluzione migliore di questa?

A CURA: Sì, c'è ...

Un mio collega più intelligente di me ha trovato questa soluzione, che sembra fare il trucco. Nella tua classe parziale per l'oggetto Linq2Sql, aggiungi il seguente codice:

public void SendPropertiesChanged()
{
     foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties())
     SendPropertyChanged(prop.Name);
}

Puoi semplicemente chiamarlo nel codice dell'applicazione:

context.Refresh(RefreshMode.OverwriteCurrentValues, employee);
employee.SendPropertiesChanged();

Tutti gli elementi dell'interfaccia utente ottengono il messaggio e si aggiornano in modo appropriato. Questo funziona anche con i controlli di treeview e cose del genere in cui non desideri che l'interfaccia utente appaia " reset " quando aggiorni i binding.

Altri suggerimenti

Se sai di chiamare Refresh (), perché non andare avanti e aggiornare comunque l'interfaccia utente a quel punto?

PropertyChanging e PropertyChanged vengono richiamati invocando il setter su una classe di entità generata da DBQ LINQtoSQL. Chiamare Refresh () non lo fa:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
public string DisplayName
{
    get
    {
        return this._DisplayName;
    }
    set
    {
        if ((this._DisplayName != value))
        {
            this.OnDisplayNameChanging(value);
            this.SendPropertyChanging();
            this._DisplayName = value;
            this.SendPropertyChanged("DisplayName");
            this.OnDisplayNameChanged();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top