2011-09-15 2 views
1

J'ai un problème avec la liste d'éléments dans une liste déroulante. Ils ne mise à jour lorsque la ItemSource est rechargée (à partir d'un fichier)ComboBox affiché Les éléments ne sont pas mis à jour

Le WPF ressemble à ceci:

<DockPanel x:Name="Dock_Profil" DataContext="{Binding Profile, UpdateSourceTrigger=PropertyChanged,NotifyOnSourceUpdated= True}"> 
        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal"> 
         <ComboBox Margin="5" Width="200" ItemsSource="{Binding}" DisplayMemberPath="ProfilName" IsSynchronizedWithCurrentItem="True" 
            x:Name="cmbProfil" SelectedIndex="0" ></ComboBox> 
         <Button Margin="5"> 
          <StackPanel Orientation="Horizontal" > 
           <Image Margin="2" Stretch="None" Source="/MEC_EDINeu;component/Resources/Add24.png" /> 
           <Label>Neues Profil</Label> 
          </StackPanel> 
         </Button> 
        </StackPanel> 

Le profil de la propriété est ce type:

Public Class EDIProfile 
    Inherits ObservableCollection(Of EDIProfil) 

A certains points que je dois recharger le contenu du profil afin

Profile.Load() 
OnPropertyChanged("Profile") 

est appelée. (OnPropertyChanged est mis en œuvre dans le ViewModelBase.vb et transmis à MainWindowViewModel)

Quand je vérifie ensuite dans le MainWindow.xaml.vb en utilisant:

For Each item As EDIProfil In cmbProfil.Items 
      MsgBox(item.ProfilName & "__" & item.lastFA) 
     Next 

les éléments corrects sont là-dedans.

Mais la liste déroulante dans l'interface graphique affiche toujours l'ancien contenu.


A i Solution trouvée (mais je ne veux pas l'utiliser pour tous comboboxes): si i (en mainwindow.xaml.vb) utilise cette ligne:

cmbProfil.Items.Refresh() 

la mise à jour éléments affichés par le travail combobox (mais shouldnt la liaison à cela?)


Je suis assez nouveau pour WPF, dans l'espoir d'obtenir de l'aide ici.

Merci à l'avance


Quand je charge les données dans MainWindowViewModel (est que la bonne façon de le faire de toute façon?):

Public Sub loadProfile() 
     'Profile.Load() 
     Profile.Clear() 
     Dim xmls As XmlSerializer = New XmlSerializer(GetType(EDIProfile)) 
     Dim reader As New StreamReader(System.Reflection.Assembly.GetExecutingAssembly().Location.Substring(0, System.Reflection.Assembly.GetExecutingAssembly().Location.LastIndexOf("\") + 1) & "EDIProfile.xml") 
     Dim temp As New EDIProfile 
     ' MsgBox("KK") 
     temp = xmls.Deserialize(reader) 
     For Each item As EDIProfil In temp 
      Profile.Add(item) 
     Next 
     reader.Close() 
     OnPropertyChanged("Profile") 

    End Sub 

Il fonctionne

+0

Si je n'ouvre pas la liste déroulante avant de recharger les éléments, ils sont affichés correctement. – BernhardAF

+0

Utilisez-vous un type de multi-threading pour mettre à jour votre ComboBox? – Rachel

+0

@Rachel non Je ne sais pas – BernhardAF

Répondre

0

essayer. .. supprimez votre liaison DataContext et liez ItemsSource directement à Profile.

<DockPanel x:Name="Dock_Profil"> 
     <StackPanel DockPanel.Dock="Top" 
        Orientation="Horizontal"> 
      <ComboBox Margin="5" 
        Width="200" 
        ItemsSource="{Binding Profile, 
              UpdateSourceTrigger=PropertyChanged, 
              NotifyOnSourceUpdated= True}" ... /> 
+0

Merci, mais déjà essayé (et cela n'a pas changé le comportement) et le datacontext est également utilisé pour d'autres éléments dans le dockpanel. – BernhardAF

Questions connexes