2012-07-27 2 views
5

J'ai du code dans un constructeur pour un UserControl WPF. Fondamentalement, je définis une liaison à un XmlDataProvider (mes données sont dynamiques). Je veux ensuite définir le CustomSort sur la vue pour être un MySorter (implémentant IComparer). Le problème est que GetDefaultView retourne null s'il est appelé directement après l'appel SetBinding - comme s'il y avait un traitement asynchrone qui se passe pour configurer l'ItemsSource. Notez que si j'appelle le même code GetDefaultView plus tard dans un bouton Click, le gestionnaire fonctionne correctement, il ne renvoie pas de valeur nulle et le mécanisme de tri fonctionne correctement.CollectionViewSource.GetDefaultView renvoie null juste après SetBinding

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding); 

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

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

Ma question est, pourquoi GetDefaultView return null lorsqu'il est appelé directement après SetBinding, est-il un événement que je dois attendre avant d'appeler GetDefaultView et obtenir une réponse non nulle?

+1

Il peut être utile de savoir où ce code est? Peut-être que la liaison elle-même est "nulle" à ce stade. – user7116

+2

J'ai fait une faute de frappe dans mon message original (maintenant corrigé), désolé. Le Users.ItemsSource dans le GetDefaultView est en fait le même MyListBox qui a l'ensemble de liaison dans la première ligne. Par conséquent pourquoi le MyListBox.ItemsSource devrait être non nul. – user1558012

Répondre

3

Est-ce que votre Users.ItemsSource est ItemCollection? Alors probablement vue serait un ItemCollection aussi parce qu'il hérite de CollectionView.

CollectionViewSource.GetDefaultView renvoie ICollectionView. Il y a plus de classes qui héritent de CollectionView puis ListCollectionView seulement. Assurez-vous que votre distribution n'échoue pas, par ex. avec ce code:

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

J'ai fait une faute de frappe dans mon message original (maintenant corrigé), désolé. Le Users.ItemsSource dans le GetDefaultView est en fait le même MyListBox qui a l'ensemble de liaison dans la première ligne. Par conséquent pourquoi le MyListBox.ItemsSource devrait être non nul. La distribution n'échoue pas lorsqu'elle est appelée dans un gestionnaire d'événements Click plus récent, donc je ne pense pas que ce soit un problème de distribution. Merci. – user1558012

+0

Quel est mon code (avec correction) montrant ?. Vérifiez dans cet ordre si MyListBox.ItemsSource est Null et si CollectionViewSource.GetDefaultView (MyListBox.ItemsSource) est Null. – LPL

+0

MyListBox.ItemsSource est null ... Cependant, il est non-null dans un bouton Gestionnaire de clic juste après - comme si il n'avait pas fini de liaison lorsqu'il est revenu de l'appel SetBinding? Il y a une bonne quantité de données dans le XmlDataProvider mais il est toujours rempli en moins d'une seconde. – user1558012

0

Cela se produit lorsque XmlDataProvider est utilisé. GetDefaultView ne renvoie pas null lorsque DataContext est défini à partir d'une instance d'objet à partir du code. Toutefois, lors de l'utilisation de XmlDataProvider, GetDefaultView renvoie null. J'ai trouvé que c'est parce que jusqu'à ce que le xml soit chargé, il retourne null.

Par conséquent, si le CollectionViewSource.GetDefaultView est appelé avec la méthode du gestionnaire d'événements de l'événement "Loaded", cela fonctionne correctement.

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

Vous pouvez trouver cet exemple suivant ce lien (sous étape 8):

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

+0

Nous avions vu des occasions aléatoires où 'CollectionViewSource.GetDefaultView' retournerait 'null' mais ne pouvait pas comprendre pourquoi. Je pense que c'est la réponse. – karmasponge

Questions connexes