2010-06-28 5 views
0

Ive a posté un autre sujet concernant l'actualisation d'une liste de diffusion silverlight - En attendant, je suis devenu un peu plus familier avec le problème. Cela concerne l'implémentation de l'interface ObservableCollection. Im utilisant des services RIA pour remplir une zone de liste avec une collection de type ObservableCollection. Le problème est l'actualisation des éléments une fois que la base de données a été mise à jour. J'utilise une fenêtre enfant Silverlight pour enregistrer les données dans la base de données, et cela se passe correctement sur l'événement de fermeture de la fenêtre enfant.ObservableCollection

Quelqu'un peut-il me donner plus d'informations sur les raisons pour lesquelles la ListBox ne se met pas à jour.

Merci

+0

Avez-vous essayé celui-ci listboxName.UpdateLayout(); – Malcolm

+0

Assurez-vous que votre liaison de données n'est pas définie sur OneTime. Êtes-vous sûr que la source de données sous-jacente est en cours de mise à jour? – DaveB

+0

Il semble que la source de données sous-jacente ne soit pas mise à jour après la mise à jour de la base de données. Pouvez-vous confirmer cela? Utilisez-vous la liaison bidirectionnelle sur la liste? –

Répondre

0

Vous devez faire votre classe poco qui est utilisé au sein de votre ObservableCollection mettre en œuvre INotifyChanged.

Exemple:

<viewModels:LocationsViewModel x:Key="viewModel" /> 
. 
. 
.  
<ListView 
    DataContext="{StaticResource viewModel}" 
    ItemsSource="{Binding Locations}" 
    IsItemClickEnabled="True" 
    ItemClick="GroupSection_ItemClick" 
    ContinuumNavigationTransitionInfo.ExitElementContainer="True"> 

    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Name}" Margin="0,0,10,0" Style="{ThemeResource ListViewItemTextBlockStyle}" /> 
       <TextBlock Text="{Binding Latitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="0,0,5,0"/> 
       <TextBlock Text="{Binding Longitude, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Style="{ThemeResource ListViewItemTextBlockStyle}" Margin="5,0,0,0" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

public class LocationViewModel : BaseViewModel 
{ 
    ObservableCollection<Location> _locations = new ObservableCollection<Location>(); 
    public ObservableCollection<Location> Locations 
    { 
     get 
     { 
      return _locations; 
     } 
     set 
     { 
      if (_locations != value) 
      { 
       _locations = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 
} 

public class Location : BaseViewModel 
{ 
    int _locationId = 0; 
    public int LocationId 
    { 
     get 
     { 
      return _locationId; 
     } 
     set 
     { 
      if (_locationId != value) 
      { 
       _locationId = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    string _name = null; 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      if (_name != value) 
      { 
       _name = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    float _latitude = 0; 
    public float Latitude 
    { 
     get 
     { 
      return _latitude; 
     } 
     set 
     { 
      if (_latitude != value) 
      { 
       _latitude = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 

    float _longitude = 0; 
    public float Longitude 
    { 
     get 
     { 
      return _longitude; 
     } 
     set 
     { 
      if (_longitude != value) 
      { 
       _longitude = value; 
       OnNotifyPropertyChanged(); 
      } 
     } 
    } 
} 

public class BaseViewModel : INotifyPropertyChanged 
{ 
    #region Events 
    public event PropertyChangedEventHandler PropertyChanged; 
    #endregion 

    protected void OnNotifyPropertyChanged([CallerMemberName] string memberName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(memberName)); 
     } 
    } 
}