2017-01-21 2 views
0

Ma liste ObservableCollection ne met pas à jour la vue. J'utilise MVVM LumièreObservableCollection ne met pas à jour ListView

Ceci est mon VM

public class MainViewModel : ViewModelBase{ 
public ObservableCollection<ProductModel> Products { get; set; } 

private void GetData() 
{ 
    //getting data here 

    Products = new ObservableCollection<ProductModel>(); 

    foreach (var item in myData) 
    { 
     Products.Add(item); 
    } 
}} 

XAML:

DataContext="{Binding Source={StaticResource Locator}, Path=Main}"><FlowDocumentReader BorderBrush = "Black" BorderThickness="2"> 
<FlowDocument> 
    <BlockUIContainer> 
     <ListView BorderThickness = "2" ItemsSource="{Binding Products}"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header = "Lp." DisplayMemberBinding="{Binding Path=OrdinalNumber}" Width="100"/> 
        <GridViewColumn Header = "id" DisplayMemberBinding="{Binding Path=id}" Width="100"/> 
        <GridViewColumn Header = "Name" DisplayMemberBinding="{Binding Path=Name}" Width="100"/> 
        <GridViewColumn Header = "Quantity" DisplayMemberBinding="{Binding Path=Quantity}" Width="100"/> 
        <GridViewColumn Header = "NetPrice" DisplayMemberBinding="{Binding Path=NetPrice}" Width="100"/> 
        <GridViewColumn Header = "GrossPrice" DisplayMemberBinding="{Binding Path=GrossPrice}" Width="100"/> 
        <GridViewColumn Header = "TotalCost" DisplayMemberBinding="{Binding Path=TotalCost}" Width="100"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 
    </BlockUIContainer> 
</FlowDocument> 

Pour moi, il semble bien. Je ne sais pas où est le problème

Répondre

1

Ce n'est pas un problème avec ObservableCollection, mais avec la définition d'une propriété Products.

Products = new ObservableCollection<ProductModel>(); 

Vous définissez dans la méthode GetData, mais vous ne l'notify vue à ce sujet, il est donc pas lié à votre ObservableCollection. Vous pouvez définir une propriété dans un constructeur ou utiliser INotifyPropertyChanged sur la propriété.

+0

ufff, je vois maintenant. Je suis assis à faire ce projet toute la journée. J'ai besoin d'air frais – Quiet

0

Je vois que vous avez déjà hérité de ViewModelBase, par conséquent, vous ne devez faire ceci:

public event PropertyChangedEventHandler PropertyChanged; 

    // This method is called by the Set accessor of each property. 
    // The CallerMemberName attribute that is applied to the optional propertyName 
    // parameter causes the property name of the caller to be substituted as an argument. 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Au lieu de cela, vous pouvez tout faire:

public class MainViewModel : ViewModelBase{ 
public ObservableCollection<ProductModel> Products { get; set; } 

private void GetData() 
{ 
    //getting data here 

    Products = new ObservableCollection<ProductModel>(); 

    foreach (var item in myData) 
    { 
     Products.Add(item); 
    } 
    RaisePropertyChanged(nameof(Products)); // you are missing this 
}}