2013-08-01 17 views
12

Ho un'applicazione WPF con pattern MVVM. In uno dei miei punti di vista, devo legare un ObservableCollection per visualizzare. A questo punto di vista, ho una ListBox e uno DataGrid entrambi si legano allo stesso ObservableCollection ma fare cose diverse, come gli eventi, lo stile ecc ..DataGridColumn con intestazione "*" già presente nell'insieme Columns di un DataGrid

ho bisogno di uno solo di questi controlli visualizzati in un tempo e quello che ho fatto è stato creato due controlli utente, uno per DataGrid e altri per ListBox. E ho commutato tra loro posizionando un ContentControl sulla vista principale (qualcosa di simile a questo blog. La vista predefinita è DataGrid e quando si fa clic su un pulsante viene visualizzata l'altra vista (ad esempio ListBox). Fino a questo sta funzionando bene.

Un'altra cosa da tenere a mente che le colonne Griglia dati sono generate dinamicamente utilizzando la soluzione descritta nel seguente link. Quindi quando torno alla visualizzazione DataGrid viene generato un errore durante l'aggiunta di colonne alla griglia dati nell'istruzione foreach (pls fare riferimento alla risposta del collegamento precedente) come

"DataGridColumn con intestazione" Ord "esiste già nella raccolta Columns di DataGrid. DataGrid non possono condividere le colonne e non possono contenere le istanze di colonna duplicati."

Ma sono sicuro che prima di aggiungere colonne per DataGrid sua proprietà Count è pari a zero (dataGrid.Columns.Count()). Così come l'intestazione DataGrid proprietà vengono mantenute? c'è un modo per cancellare i valori di intestazione ?.

si prega di suggerire ...

+0

È possibile provare uno strumento come [Snoop] (http://snoopwpf.codeplex.com/) per esaminare l'albero visivo. – oddparity

+0

Possiamo vedere il ViewModel e il Modello per questo o almeno un esempio equivalente? –

+0

Il problema potrebbe dipendere dalla variabile 'columns' che si popola dagli argomenti. Utilizzare il debugger ed esaminare il contenuto di quello precedente all'istruzione foreach a cui si sta facendo riferimento. La duplicazione potrebbe essere lì –

risposta

0

Quando si aggiunge un'istanza a un controllo o un elemento in WPF si dovrebbe allways pulire padre del controllo aggiunto, in quanto, quando aggiungi un controllo a una raccolta di child, il genitore il controllo viene aggiunto al nuovo figlio come genitore, questo è ciò che il messaggio ti dice

0

Se si utilizzano i trigger per scambiare le viste, impostare il contenuto come una risorsa dinamica in modo che il datagrid sia sempre risolto in fase di runtime.

0

Se la griglia di dati e il relativo binding sono impostati una volta, non ostacolare l'istanza di colonne di dati create, se la raccolta osservabile non cambia, utilizzare invece la proprietà visibility per il controllo utente creato per entrambe le caselle di riepilogo e griglia di dati utilizzando i trigger.

2

Ho avuto lo stesso errore dopo aver utilizzato il comportamento nello mentioned link. La domanda è vecchia ma nel caso che qualcun altro abbia lo stesso problema, l'ho risolto aggiungendo una classe 'bridge' da usare invece di aggiungere direttamente le colonne.

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Windows.Controls; 

namespace AlyElHaddad.Stackoverflow 
{ 
    public class DataGridColumnCollection : ObservableCollection<DataGridColumn> 
    { 
     public DataGridColumnCollection() 
      : base() 
     { } 
     public DataGridColumnCollection(IEnumerable<DataGridColumn> collection) 
      : base(collection) 
     { } 
     public DataGridColumnCollection(List<DataGridColumn> list) 
      : base(list) 
     { } 
    } 
} 

In XAML, invece di aggiungere direttamente colonne, aggiungerli all'interno di una DataGridColumnCollection.

<aly:DataGridColumnCollection xmlns:aly="clr-namespace:AlyElHaddad.Stackoverflow"> 
    <DataGridTextColumn Header="Column1" Binding="{Binding Column1}"/> 
    <DataGridTextColumn Header="Column2" Binding="{Binding Column2}"/> 
    <DataGridTextColumn Header="Column3" Binding="{Binding Column3}"/> 
</aly:DataGridColumnCollection> 
Problemi correlati