2012-12-26 15 views
6

Così i principi fondamentali: Ho una finestra con un controllo ListView su di esso, che è popolata da DataContext di mia griglia:ListView Binding con DataTable, non aggiornare dopo l'eliminazione di fila

mainGrid.SetBinding(Grid.DataContextProperty, 
    new Binding() { 
     Source = new DataView() 
      { Table = SQLHandler.GetHandler[classType.ToString()] } 
    } 
); 

in XAML:

<ListView Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding}"> 

tutto funziona correttamente, è popolato. Come puoi vedere sopra, ho una classe SQLHandler a cui si può accedere Singleton, e posso accedere alle mie tabelle con un indicizzatore.

Il problema: la finestra si carica, sto selezionando una riga, facendo clic sul pulsante Modifica, la nuova finestra si carica, dove ottengo i dettagli della riga selezionata. quando cancello questa riga tramite questa nuova finestra e la chiudo, la finestra principale (dove viene mostrato il datatable completo) non viene aggiornata di conseguenza. so quale dovrebbe essere la soluzione, ma non riesco a farlo funzionare. (inotifyproperty ha cambiato l'interfaccia in classe SqlHandler, Binding.IndexerName ecc.)

ecco la cosa principale: il set di dati non è nella mia classe SqlHandler, è in SqlExecuter, dove vengono eseguiti tutti i miei sqlcommands.

public override DataTable this[string key] 
{ 
    get 
    { 
     if (sqlExecuter.GetDataSet.Tables.Contains(key)) 
      return sqlExecuter.GetDataSet.Tables[key]; 
     throw new KeyNotFoundException("The specified key was not found"); 
    } 
} 

dove getDataSet è:

public DataSet GetDataSet 
{ 
    get { return ds; } 
} 

Come posso fare questo lavoro? Quando elimino una riga in una finestra diversa e chiudo quella, la listview della finestra principale non si aggiorna da sola. L'unica opzione che ho è di mettere un pulsante di aggiornamento, e quindi ricollegare la proprietà datacontext, quindi ovviamente funziona, ma il mio obiettivo è avere un sistema di aggiornamento "live", ecco perché Binding è dopotutto.

Cosa ho provato: GetDataSet in SqlExecuter: ha implementato l'interfaccia inotifypropertychanged, ma non è cambiato nulla. e non posso avere implementato un'implementazione modificata sul mio indicizzatore in SqlHandler, perché non ha un setter, sto semplicemente accedendo alle tabelle da code-behind, il mio sqldataadapter le sta popolando (metodo Fill)

ps : non ho intenzione di creare una ObservableCollection, perché il 90% del mio codice dovrebbe essere riscritto e quando cancellerò una riga, cancellerò il mio set di dati e lo riempirò di nuovo, quindi non mi aspetto nemmeno che noterà ogni cambiamento , proprio quando ho riempire il mio datatable, la mia ListView dovrebbe sapere su di esso .. e aggiornare se stesso

risposta

0

potrebbe essere necessario impostare la modalità di legame a due vie:

Mode = BindingMode.TwoWay 

WPF per alcuni motivi non ovvi, il valore predefinito è il collegamento unidirezionale. Spero possa aiutare. Non sono particolarmente ben informato, ma ho visto questo problema con semplici collegamenti dati a ObservableCollections e il binding TwoWay lo risolve.

1

Penso che l'utilizzo di una seconda finestra come popup potrebbe essere il problema qui. Se stavi facendo il montaggio sulla stessa pagina, allora si potrebbe utilizzare un semplice

ListView1.DataBind() 

Per aggiornare il contenuto della lista alla fine del comando di cancellazione. Oppure puoi utilizzare il metodo IsPostBack per aggiornare l'elenco se la pagina è stata ridisegnata anziché ricaricata.

Si potrebbe provare a chiamare il nome della pagina e quindi la visualizzazione elenco dall'altra finestra, ma non sono sicuro se è possibile eseguire questo tipo di comando da un'altra finestra.

In alternativa è possibile eseguire la modifica su una pagina diversa, piuttosto che una finestra separata in modo che quando si ritorna alla pagina originale la listview venga ridisegnata.

Come te sono sicuro che c'è una soluzione più semplice al tuo problema, ma sfortunatamente non lo so.

Problemi correlati