2009-05-25 9 views
3

Aperçu du projetWPF DataContext ne rafraîchit pas le DataGrid en utilisant le modèle MVVM

J'ai une vue qui se lie à une viewmodel contenant 2 ObserverableCollection. Le constructeur viewmodel remplit la première collection ObserverableCollection et la vue datacontext est collectée pour la lier via une propriété publique appelée Sites.

Plus tard, le 2ed ObserverableCollection est rempli dans la méthode LoadOrders et la propriété publique LoadFraudResults est mise à jour pour la relier à datacontext. J'utilise WCF pour extraire les données de la base de données et les tirer très bien.

viewmodel SOURCE

class ManageFraudOrderViewModel:ViewModelBase 
{ 
    #region Fields   
    private readonly ICollectionView collectionViewSites; 
private readonly ICollectionView collectionView; 
    private ObservableCollection<GeneralAdminService.Website> _sites; 
    private ObservableCollection<FraudService.OrderQueue> _LoadFraudResults; 

    #endregion 

    #region Properties 
    public ObservableCollection<GeneralAdminService.Website> Sites 
    { 
     get { return this._sites; } 
    } 
    public ObservableCollection<FraudService.OrderQueue> LoadFraudResults 
    { 
     get { return this._LoadFraudResults;} 
    } 
    #endregion 

    public ManageFraudOrderViewModel() 
    { 
     //Get values from wfc service model 
     GeneralAdminService.GeneralAdminServiceClient generalAdminServiceClient = new GeneralAdminServiceClient(); 
     GeneralAdminService.Website[] websites = generalAdminServiceClient.GetWebsites(); 
     //Get values from wfc service model    

     if (websites.Length > 0) 
     { 
      _sites = new ObservableCollection<Wqn.Administration.UI.GeneralAdminService.Website>(); 
      foreach (GeneralAdminService.Website website in websites) 
      { 
       _sites.Add((Wqn.Administration.UI.GeneralAdminService.Website)website); 
      } 

    this.collectionViewSites= CollectionViewSource.GetDefaultView(this._sites); 
     } 
     generalAdminServiceClient.Close(); 
    } 

    public void LoadOrders(Wqn.Administration.UI.FraudService.Website website) 
    { 
     //Get values from wfc service model    
     FraudServiceClient fraudServiceClient = new FraudServiceClient(); 
     FraudService.OrderQueue[] OrderQueue = fraudServiceClient.GetFraudOrders(website); 
     //Get values from wfc service model    

     if (OrderQueue.Length > 0) 
     { 
      _LoadFraudResults = new ObservableCollection<Wqn.Administration.UI.FraudService.OrderQueue>(); 
      foreach (FraudService.OrderQueue orderQueue in OrderQueue) 
      { 
       _LoadFraudResults.Add(orderQueue); 
      } 
     } 

    this.collectionViewSites= CollectionViewSource.GetDefaultView(this._LoadFraudResults); 
     fraudServiceClient.Close(); 
    } 

}


SOURCE VIEW

public partial class OrderQueueControl: UserControl {

private ManageFraudOrderViewModel manageFraudOrderViewModel ; 
    private OrderQueue orderQueue; 
    private ButtonAction ButtonAction; 
    private DispatcherTimer dispatcherTimer; 

    public OrderQueueControl() 
    { 

      LoadOrderQueueForm(); 
    } 

    #region LoadOrderQueueForm 
    private void LoadOrderQueueForm() 
    {  
    //for binding the first observablecollection 
     manageFraudOrderViewModel = new ManageFraudOrderViewModel(); 
     this.DataContext = manageFraudOrderViewModel;   
    } 
    #endregion 

    private void cmbWebsite_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     BindItemsSource(); 
    } 

    #region BindItemsSource 
    private void BindItemsSource() 
    { 
     using (OverrideCursor cursor = new OverrideCursor(Cursors.Wait)) 
     { 

      if (!string.IsNullOrEmpty(Convert.ToString(cmbWebsite.SelectedItem))) 
      { 
        Wqn.Administration.UI.FraudService.Website website = (Wqn.Administration.UI.FraudService.Website)Enum.Parse(typeof(Wqn.Administration.UI.FraudService.Website),cmbWebsite.SelectedItem.ToString()); 

     //for binding the second observablecollection******* 
        manageFraudOrderViewModel.LoadOrders(website); 
        this.DataContext = manageFraudOrderViewModel; 
     //for binding the second observablecollection******* 
      }    
     } 
    } 
    #endregion 

}

XAML

ComboBox x: Name = "cmbWebsite" ItemsSource = "{Binding Sites}" Marge = "5" width = "100" height = "25" SelectionChanged = "cmbWebsite_SelectionChanged"

DataGrid ItemsSource = {Binding Path = LoadFraudResults}

ZONE dE PROBLÈME:

Quand j'appelle le LoadOrderQueueForm pour lier la première ObservableCollection et plus tard BindItemsSource à lier 2ED collection observable, tout fonctionne bien et aucun probl em pour la première fois contraignant. Mais lorsque j'appelle BindItemsSource pour repeupler la collection obseravabl basée sur la valeur de liste modifiable sélectionnée via cmbWebsite_SelectionChanged, la collection observalblecollection est remplie avec une nouvelle valeur et la propriété LoadFraudResults dans viewmodule est remplie avec de nouvelles valeurs; mais lorsque j'appelle le datacontext pour relier le DataGrid, le DataGrid ne reflète pas les valeurs modifiées. En d'autres termes, la grille de données ne change pas lorsque le datacontext est appelé l'heure 2ed dans la méthode BindItemsSource de la vue.

manageFraudOrderViewModel.LoadOrders (site Web);
this.DataContext = manageFraudOrderViewModel; Les valeurs manageFraudOrderViewModel sont correctes mais la grille de données n'est pas liée aux valeurs modifiées.

S'il vous plaît aider, car je suis coincé avec cette chose pour les 2 derniers jours et la date limite approche.

Merci à l'avance

Répondre

5

essayer d'utiliser datagrid.Items.Refresh()!

+0

C'est tellement ennuyeux !!!!!! –

+0

vous savez que ce n'est pas la solution. –

3

Oui, ilu2009 est correct.

liaison à l'aide du modal MVVM à un DataGrid et en changeant les objets DataGrid.ItemsSource nécessite DataGrid.ItemsSource.Refresh() pour elle de réfléchir sur l'interface utilisateur.