46 votes

WPF MVVM ComboBox SelectedItem ou SelectedValue ne fonctionne pas

Mise à jour

Après quelques recherches. Ce qui semble être le problème, c'est que la SelectedValue/SelectedItem se produit avant que la source de l'élément n'ait fini de se charger. Si je m'assois à un point d'arrêt et que j'attends quelques secondes, cela fonctionne comme prévu. Je ne sais pas comment je vais résoudre ce problème.

Fin de la mise à jour

J'ai une application en WPF utilisant MVVM avec une ComboBox. Ci-dessous se trouve l'exemple du ViewModel. Le problème que je rencontre est que lorsque nous quittons notre page et que nous revenons, la ComboBox ne sélectionne pas la valeur courante qui est sélectionnée.

Voir le modèle

public class MyViewModel
{
     private MyObject _selectedObject;
     private Collection<Object2> _objects;
     private IModel _model;

     public MyViewModel(IModel model)
    {
         _model = model;
         _objects = _model.GetObjects();
    }

    public Collection<MyObject> Objects
    {
         get
         {
              return _objects;
         }
         private set
         {
              _objects = value;
         }
     }

     public MyObject SelectedObject
     {
          get
          {
              return _selectedObject;
          }
          set
          {
               _selectedObject = value;
          }
      }
 }

Pour les besoins de cet exemple, disons que MyObject possède deux propriétés (Text et Id). Mon XAML pour la ComboBox ressemble à ceci.

XAML

<ComboBox Name="MyComboBox" Height="23"  Width="auto" 
    SelectedItem="{Binding Path=SelectedObject,Mode=TwoWay}" 
    ItemsSource="{Binding Objects}"
    DisplayMemberPath="Text"
    SelectedValuePath="Id">

Quelle que soit ma configuration, lorsque je reviens sur la page et que l'objet est réassemblé, la ComboBox ne sélectionne pas la valeur. L'objet renvoie pourtant le bon objet via le get dans la propriété.

Je ne suis pas sûr qu'il s'agisse d'un problème lié au fonctionnement de la ComboBox et du modèle MVVM. La liaison avec la zone de texte que nous effectuons fonctionne correctement.

0voto

markti Points 2191

Il pourrait s'agir de la manière dont vous appliquez le DataContext à la page. Dans WPF, chaque fois que vous naviguez vers une page, tout est réinitialisé, le constructeur est appelé, les méthodes chargées, tout. Donc, si vous définissez votre DataContext à l'intérieur de votre View, vous allez sans aucun doute faire disparaître le SelectedItem que l'utilisateur a sélectionné. Pour éviter cela, utilisez la propriété KeepAlive de vos pages.

<Page KeepAlive="True" ...>
   ...
</Page>

Ainsi, seul l'événement Loaded sera déclenché lorsque vous reviendrez sur une page que vous avez déjà visitée. Vous devrez donc vous assurer que vous définissez le DataContext lors de l'initialisation (soit en externe, soit dans le constructeur) plutôt que lors du chargement.

Cependant, cela ne fonctionnera que pour cette instance de la page. Si vous naviguez vers une nouvelle instance de cette page, le constructeur sera à nouveau appelé.

0voto

Sean Campbell Points 11

ComboBox.SelectionBoxItem.ToString()

0voto

Vinicius Points 1

Utiliser l'événement Loaded :

private void cmb_Loaded(object sender, RoutedEventArgs e) {
    if (cmb.Items.Count > 0) cmb.SelectedIndex = 0;          
}

Cela fonctionne pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X