2012-07-27 13 views
5

Ho un codice in un costruttore per un UserControl WPF. Fondamentalmente ho impostato un legame con un XmlDataProvider (i miei dati sono dinamici). Quindi voglio impostare CustomSort sulla vista per essere un MySorter (implementando IComparer).CollectionViewSource.GetDefaultView restituisce null solo dopo SetBinding

Il problema è che GetDefaultView restituisce null se chiamato direttamente dopo la chiamata SetBinding - come se ci fosse qualche elaborazione asincrona in corso per impostare ItemsSource. Nota che se chiamo più tardi lo stesso codice GetDefaultView in un pulsante Click handler funziona bene, non restituisce null e il meccanismo di ordinamento funziona perfettamente e dandy.

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding); 

ListCollectionView view = CollectionViewSource.GetDefaultView(MyListBox.ItemsSource) as ListCollectionView; 

view.CustomSort = new MySorter(); // falls over - view is null 

La mia domanda è, perché nulla GetDefaultView ritorno quando ha chiamato subito dopo SetBinding, c'è un evento che ho bisogno di aspettare prima che chiami GetDefaultView e ottenere una risposta non nullo?

+1

Potrebbe essere utile sapere dove questo codice? Forse il legame stesso è "null" a questo punto. – user7116

+2

Ho fatto un refuso nel mio post originale (ora corretto), mi dispiace. User.ItemsSource in GetDefaultView è in realtà lo stesso MyListBox con l'insieme di rilegature nella prima riga. Quindi perché MyListBox.ItemsSource dovrebbe essere non nullo. – user1558012

risposta

3

È il tuo Users.ItemsSource un ItemCollection? Quindi probabilmente la vista sarebbe anche una ItemCollection perché eredita da CollectionView.

CollectionViewSource.GetDefaultView restituisce un ICollectionView. Esistono più classi che ereditano da CollectionView quindi solo da ListCollectionView. Assicurati che il tuo cast non fallisca, ad es. con questo codice:

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource); 
Console.WriteLine(view.GetType()); 
+1

Ho fatto un refuso nel mio post originale (ora corretto), mi dispiace. User.ItemsSource in GetDefaultView è in realtà lo stesso MyListBox con l'insieme di rilegature nella prima riga. Quindi perché MyListBox.ItemsSource dovrebbe essere non nullo. Il cast non fallisce quando chiamato in un gestore di eventi Click successivo, quindi non penso che sia un problema di casting. Grazie. – user1558012

+0

Qual è il mio codice (con correzione) che mostra ?. Controlla in questo ordine se MyListBox.ItemsSource è Null e se CollectionViewSource.GetDefaultView (MyListBox.ItemsSource) è Null. – LPL

+0

MyListBox.ItemsSource è null ... Tuttavia non è nullo in un pulsante Fare clic su gestore subito dopo - come se non avesse terminato l'associazione al momento del ritorno dalla chiamata SetBinding? C'è una buona quantità di dati in XmlDataProvider ma continua a popolarsi in meno di un secondo. – user1558012

0

Ciò accade quando si utilizza XmlDataProvider. GetDefaultView non restituisce null quando DataContext viene impostato da un'istanza dell'oggetto dal codice. Tuttavia, quando utilizzato XmlDataProvider, GetDefaultView restituisce null. Ho scoperto che è perché fino a quando il xml è caricato restituisce null.

Pertanto, se viene richiamato CollectionViewSource.GetDefaultView con il metodo del gestore eventi dell'evento "Loaded", funziona correttamente.

public MainWindow() 
    { 
     InitializeComponent(); 
     this.comboBox1.Loaded += new RoutedEventHandler(ComboBoxLoaded);   
    } 

    private void ComboBoxLoaded(object sender, RoutedEventArgs e) 
    { 
     ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(((XmlDataProvider)this.myGrid.DataContext).Data); 
     view.SortDescriptions.Add(new SortDescription("Location", ListSortDirection.Ascending)); 
    }  

Potete trovare questo esempio questo link (in fase 8):

http://wpfgrid.blogspot.com/2013/01/simple-combobox-implementation.html

+0

Abbiamo visto occasioni casuali in cui "CollectionViewSource.GetDefaultView" restituiva "null" ma non riusciva a capire perché. Penso che questa sia la risposta. – karmasponge

Problemi correlati