2009-07-10 11 views
0

J'ai une application mvvm que la fenêtre principale est un contrôle de tabulation. j'utilise l'itemsource pour lier des éléments à la zone de liste déroulante, tout fonctionne bien jusqu'à ce que je passe à un autre onglet et pour une raison quelconque l'élément sélectionné de la zone de liste déroulante obtenir la valeur nulle, des idées?wpf ComboBox Liaison asynchrone aux éléments source problème

la liaison est twoway updatesource OnPropertyChanged et la propriété est le type de ObservableCollection

+0

Pouvez-vous poster le XAML pertinent et/ou C#? Cela pourrait nous aider à comprendre ce que vous essayez de faire et à réduire le problème. – Andy

Répondre

1

J'ai eu le même problème avant. Et la solution est que assurez-vous que l'attribut Itemsource de comboBox en XAML n'a pas été déclaré avant l'attribut SelectedValue. Cela devrait fonctionner ensuite.

+0

J'ai vu XAMl ci-dessus. Déplacer l'attribut Itemsource après l'attribut selectedvalue. Je vais travailler –

0

J'ai une application MVVM avec presque exactement le même scénario. La fenêtre principale a un contrôle de tabulation. Il y a un onglet contenant une liste déroulante. La source d'éléments de liste déroulante est liée à un IList (dans le modèle de vue) et la valeur Sélectionnée est liée à une propriété dans le modèle de vue implémentant INotifyPropertyChanged. Lors de la sélection d'un autre onglet, la propriété du modèle de vue lié à SelectedValue est mystérieusement définie sur Null. Je suis capable de le traiter en ne permettant pas la propriété liée SelectedValue-être réglé sur null:

public Judge SelectedJudge 
    { 
    get { return selectedJudge; } 
    set 
    { 
     if(selectedJudge==value || value==null) return; 
     selectedJudge = value; 
     OnPropertyChanged("SelectedJudge"); 
     updateViewData(); 
    } 
    } 

Cependant, ce n'est pas clair pour moi pourquoi un volet d'onglet devenir invisible implique une valeur dans une combobox il est désélectionnée

+0

c'est mon problème deux –

+0

Y at-il une raison pour laquelle vous utilisez SelectedValue et non SelectedItem? Pas nécessairement une erreur, tant que vous savez ce que vous faites, juste m'énerver. Voir l'action se produire dans updateViewData peut vous aider à résoudre votre problème. –

0

Si, pour une raison quelconque, la BindingSource de ItemsSource ne contient plus SeletedItem (parce qu'elle est réinitialisée ou autre), alors SelectedItem peut être réinitialisé à sa valeur par défaut, c'est-à-dire null. De votre exemple, je ne peux pas dire pourquoi cela devrait se produire, mais peut-être parce que vous avez manqué d'ajouter un peu plus de code environnemental.

0

C'est peut-être un problème avec votre viewmodel ierarchy. Par exemple, si les deux extrémités de votre liaison sont des propriétés de dépendance et que la propriété ownertype n'est pas liée à une classe particulière (par exemple, définissez la classe parente), cette propriété de dépendance sera utilisée par tous les héritiers. Mauvaise conception

1

Il est juste nécessaire de travailler sur un ObservableCollection et charger uniquement AddRange (pas utiliser « Ajouter »)

Lorsque nous chargeons les données suivantes:

foreach (object item in items) 
{ 
    MyList.Add(item); // Where MyList is a ObservableCollection 
} 

Puis après avoir ajouté du premier élément l'appel ObservableCollection OnCollectionChanged. Ensuite, le ComboBox va essayer de sélectionner la SelectedValue et retourner 'null' quand ne peut pas trouver cet élément.

Il peut résoudre un problème:

using System.Collections.Generic; 
using System.Collections.Specialized; 
using System.ComponentModel; 

namespace System.Collections.ObjectModel 
{ 
    /// <summary> 
    /// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    public class ObservableCollectionEx<T> : ObservableCollection<T> 
    { 
     /// <summary> 
     /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
     /// </summary> 
     public ObservableCollectionEx() 
      : base() { } 

     /// <summary> 
     /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
     /// </summary> 
     /// <param name="collection">collection: The collection from which the elements are copied.</param> 
     /// <exception cref="System.ArgumentNullException">The collection parameter cannot be null.</exception> 
     public ObservableCollectionEx(IEnumerable<T> collection) 
      : base(collection) { } 

     /// <summary> 
     /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
     /// </summary> 
     public void AddRange(IEnumerable<T> collection) 
     { 
      // 
      // Add the items directly to the inner collection 
      // 
      foreach (var data in collection) 
      { 
       this.Items.Add(data); 
      } 

      // 
      // Now raise the changed events 
      // 
      this.OnPropertyChanged(new PropertyChangedEventArgs("Count")); 
      this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]")); 

      this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); 
     } 

    } 
} 
Questions connexes