2009-11-20 8 views
3

J'ai mis le ItemsSource d'un ListBox à une collection ObservableCollection<Employee>, et ma Employee classe implémente INotifyPropertyChanged.ObservableCollection <T> ne met pas à jour ListBox

Sur le Employee, j'ai lié plusieurs propriétés, l'une d'entre elles une propriété Color, et je me suis assuré qu'il appelle l'événement PropertyChanged lorsqu'il est modifié. J'ai également vérifié avec le débogueur que l'invocation PropertyChanged est appelée.

Toutefois, lorsque l'DataBound Background du ListBoxItem dans la limite ListBox ne jamais mettre à jour, ce qui est extrêmement fustrating.

En réglant le ItemsSource sur null, et en le réinitialisant après que fonctionne, mais ce n'est pas comment nous sommes censés utiliser le modèle Observateur.

Le XAML utilisé:

<Style TargetType="{x:Type ListBoxItem}"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" 
         Color="{x:Static SystemColors.HighlightColor}" /> 
    </Style.Resources> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Background" 
      Value="{Binding Path=Color, Converter={StaticResource ColorConverter}}" /> 
    <Setter Property="Content" Value="{Binding Path=Name}" /> 
    <Setter Property="Height" Value="25" /> 
    <Setter Property="Margin" Value="0,1,0,1" /> 
    <EventSetter Event="MouseDoubleClick" Handler="HelperList_MouseDoubleClick" /> 
</Style> 

<ListBox x:Name="helperList" Grid.Column="0" Grid.Row="1" 
     Margin="5,2,0,5" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
     ScrollViewer.VerticalScrollBarVisibility="Visible" 
     SelectionChanged="HelperList_SelectionChanged"> 
</ListBox> 

Plus code en réponse à la première réponse:

public class Employee : Person 
{ 
    private EmployeeColor color = new EmployeeColor(); 
    public EmployeeColor Color 
    { 
     get { return this.color; } 
     set 
     { 
      if(!this.color.Equals(value)) 
       OnPropertyChanged("Color"); 

      this.color = value; 
     } 
    } 
} 

var employees = new ObservableCollection<Employee>(); 
//... fill out data here  
helperList.ItemsSource = employees; 
+1

Rien de mal ici, pouvez-vous fournir plus de code? Classe d'employeur et comment définissez-vous ItemSource? –

+0

terminé, vérifiez le code mis à jour. Même cela devrait être assez évident, comme je l'ai dit, je viens de définir la propriété ItemSource à un ObserverableCollection! –

+2

Que contient votre ColorConverter? Est-ce qu'il convertit une couleur en pinceau comme prévu par la propriété Background? Je soupçonne que le problème est là. – Mart

Répondre

2

Problème résolu.

OnPropertyChanged a été appelé avant que la valeur réelle de la propriété a été définie, de sorte que l'interface utilisateur a été mise à jour en conséquence à la valeur ancienne.

Solution: appelez OnPropertyChanged après en définissant la valeur de la propriété.

+0

semble logique. :) La propriété n'est modifiée que lorsque vous avez défini la valeur. :) Il existe également une interface INotifyPropertyChanging ... –

Questions connexes