2012-07-27 12 views
5

Tengo un código en un constructor para un UserControl de WPF. Básicamente establezco un enlace a un XmlDataProvider (mis datos son dinámicos). Luego quiero configurar CustomSort en la vista para que sea un MySorter (implementando IComparer).CollectionViewSource.GetDefaultView devuelve nulo justo después de SetBinding

El problema es que GetDefaultView devuelve nulo si se llama directamente después de la llamada SetBinding, como si hubiera algún proceso asíncrono para configurar el ItemsSource. Tenga en cuenta que si llamo al mismo código GetDefaultView más tarde en un botón Click handler, funciona bien, no devuelve null y el mecanismo de clasificación funciona bien y dandy.

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding); 

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

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

Mi pregunta es, ¿por qué nula rentabilidad GetDefaultView cuando llama directamente después SetBinding, ¿hay un evento que necesito que esperar antes de que llame GetDefaultView y obtener una respuesta que no sea nulo?

+1

Podría ayudar a saber dónde está el código? Quizás el enlace en sí sea 'nulo' en este punto. – user7116

+2

Hice un error tipográfico en mi publicación original (ahora corregido), lo siento. El Users.ItemsSource en GetDefaultView es en realidad el mismo MyListBox que tiene el conjunto de enlaces en la primera línea. De ahí que el MyListBox.ItemsSource no sea nulo. – user1558012

Respuesta

3

¿Es Users.ItemsSource un ItemCollection? Entonces probablemente view también sería ItemCollection porque hereda de CollectionView.

CollectionViewSource.GetDefaultView devuelve ICollectionView. Hay más clases que heredan de CollectionView y luego ListCollectionView solamente. Asegúrate de que tu lanzamiento no falle, p. con este código:

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

Hice un error tipográfico en mi publicación original (ahora corregido), lo siento. El Users.ItemsSource en GetDefaultView es en realidad el mismo MyListBox que tiene el conjunto de enlaces en la primera línea. De ahí que el MyListBox.ItemsSource no sea nulo. El reparto no falla cuando se lo llama en un controlador de evento Click posterior, así que no creo que sea un problema de transmisión. Gracias. – user1558012

+0

¿Qué muestra mi código (con corrección) ?. Compruebe en este orden si MyListBox.ItemsSource es nulo y si CollectionViewSource.GetDefaultView (MyListBox.ItemsSource) es nulo. – LPL

+0

MyListBox.ItemsSource es nulo ... Sin embargo, no es nulo en un botón Click handler justo después, como si no hubiera terminado de vincularse cuando regresó de la llamada SetBinding? Hay una buena cantidad de datos en XmlDataProvider, pero aún se completa en menos de un segundo. – user1558012

0

Esto ocurre cuando se utiliza XmlDataProvider. GetDefaultView no devuelve nulo cuando DataContext se establece desde una instancia de objeto desde el código. Sin embargo, cuando se usa XmlDataProvider, GetDefaultView devuelve null. Descubrí que es porque hasta que cargue xml, devuelve null.

Por lo tanto, si se llama a CollectionViewSource.GetDefaultView desde el método de controlador de eventos del evento "Cargado", funciona bien.

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)); 
    }  

Puede encontrar este ejemplo siguiendo este enlace (en la etapa 8):

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

+0

Hemos visto ocasiones aleatorias en las que 'CollectionViewSource.GetDefaultView' devolvería 'nulo' pero no podría entender por qué. Creo que esta es la respuesta. – karmasponge

Cuestiones relacionadas