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
C'est tellement ennuyeux !!!!!! –
vous savez que ce n'est pas la solution. –