2009-05-25 25 views
3

ProjektübersichtWPF Datacontext nicht aktualisiert das Datagrid mit MVVM Modell

Ich habe eine Ansicht, die zu einem Viewmodel, das 2 ObserverableCollection bindet. Der Viewmodel-Konstruktor füllt die erste ObservableCollection und der View-Datenkontext wird gesammelt, um über eine öffentliche Eigenschaft namens Sites an ihn gebunden zu werden.

Später wird die 2ed ObservableCollection in der LoadOrders-Methode aufgefüllt und die öffentliche Eigenschaft LoadFraudResults wird aktualisiert, um sie mit datacontext zu binden.

Ich benutze WCF, um die Daten aus der Datenbank zu ziehen und es wird sehr schön gezogen.

Ansichtsmodell 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(); 
    } 

}


VIEW SOURCE

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 = "{Seiten Binding}" RAND = "5" Breite = "100" height = "25" Selection = "cmbWebsite_SelectionChanged"

Datagrid Itemssource = {Binding Path = LoadFraudResults}

Problemkreis:

Als ich die LoadOrderQueueForm rufen Sie die erste ObservableCollection und später BindItemsSource zu binden 2ed beobachtbaren Sammlung zu binden, funktioniert alles einwandfrei und kein probl em zum ersten Mal verbindlich.

Wenn ich jedoch BindItemsSource erneut aufrufen, um die obseravablecollection basierend auf dem geänderten ausgewählten Kombinationswert über cmbWebsite_SelectionChanged erneut zu füllen, wird die observalgeblecollection mit einem neuen Wert gefüllt und die LoadFraudResults-Eigenschaft in viewmodule wird mit neuen Werten gefüllt. Wenn ich jedoch den Datenkontext aufruft, um das Datagrid erneut zu binden, gibt das Datagrid die geänderten Werte nicht wieder.

Mit anderen Worten, das Datagrid wird nicht geändert, wenn der Datenkontext in der BindItemsSource-Methode der Ansicht die 2te Zeit aufgerufen wird.

manageFraudOrderViewModel.LoadOrders (Website);
this.DataContext = manageFraudOrderViewModel;

Werte von manageFraudOrderViewModel sind korrekt, aber das Datagrid wird nicht mit geänderten Werten veröffentlicht.

Bitte helfen Sie mir, wie ich mit diesem Ding seit letzten 2 Tagen fest bin und die Frist nähert sich in der Nähe.

Vielen Dank im Voraus

Antwort

5

try datagrid.Items.Refresh() zu verwenden!

+0

Das ist so nervig !!!!!! –

+0

Sie wissen, das ist nicht die Lösung. –

3

Ja, ilu2009 ist korrekt.

Bindung mit dem MVVM modal an einen Datenraster und Ändern der Objekte in DataGrid.ItemsSource erfordert DataGrid.ItemsSource.Refresh() für sie auf der Benutzeroberfläche zu reflektieren.

Verwandte Themen