2010-07-23 3 views
0

Je crée une page principale silverlight detials et je n'arrive pas à mettre à jour la grille de données après avoir inséré un nouvel enregistrement. En haut de la page j'ai des zones de texte pour entrer des informations, quand un utilisateur clique sur enregistrer je voudrais que l'information soit automatiquement mise à jour dans la base de données et affichée sur la grille de données sans actualiser l'écran.Je ne parviens pas à actualiser/mettre à jour la grille de données après insertion dans Silverlight 4

Je suis en mesure d'enregistrer les informations sur le db sans problème sa juste essayer d'obtenir le DataGrid pour se rafraîchir avec les nouveaux changements.

Certains de mon code derrière le bouton SAVE est ci-dessous:

ViewModel.UpdateWorkflow(summary, reason, Email); 
LoadOperation<Document> lo = _Context.Load<Document>(_Context.GetDocumentsQuery(_DocID), rtRefresh, null); 

Le code pour rtRefresh:

private void rtRefresh(LoadOperation<Document> oLoadOperation) 
    {    
     if (oLoadOperation.IsComplete) 
     {               
      ViewModel.GetDocuments(_DocID); 
     } 
    } 

Je mis le ViewModel dans le fichier XAML comme:

<controls:ChildWindow.Resources> 
    <viewModel:DocumentChildWindowViewModel x:Key="ViewModel" /> 
</controls:ChildWindow.Resources> 

Et le ViewModel dans le code-behind:

ViewModel = Resources["ViewModel"] as DocumentChildWindowViewModel; 

Toute aide serait appréciée, merci.

Répondre

0

Dans mon ViewModel je crée d'abord une nouvelle DomainContext():

public DocumentWindowViewModel() 
    { 
     _Context = new appDomainContext();      
     WireCommands(); 
    } 

J'ai fini par avoir à copier la ligne suivante à ma requête:

_Context = new appDomainContext(); 

Et coller à la fonction que g rabs les valeurs de la base de données:

public void GetDocuments(int dID) 
    {   
      _Context = new appDomainContext(); //ADDED THIS LINE TO FIX MY ISSUE        
      _Context.Load(_Context.GetDocumentsQuery(dID), dlo => 
       { 
        DocumentsView = dlo.Entities;             
       }, null);         
     } 
    } 

le _Context conservait les anciennes valeurs. Cela a effacé le _Context et m'a permis d'avoir les données mises à jour dans le _Context.

1

Je suppose que votre DataGrid est lié à un IEnumerable, peut-être une liste <>? Avez-vous essayé d'utiliser un ObservableCollection <>? Si vous êtes lié à un ObservableCollection, il informera l'interface utilisateur lorsque la collection aura changé.

<UserControl x:Class="SilverlightApplication1.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:SilverlightApplication1" 
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<UserControl.DataContext> 
    <local:MainPage_ViewModel/> 
</UserControl.DataContext> 

<StackPanel> 
    <data:DataGrid ItemsSource="{Binding MyCollection}"> 

    </data:DataGrid> 
</StackPanel> 

public class MainPage_ViewModel : INotifyPropertyChanged 
{ 
    public ObservableCollection<object> MyCollection 
    { 
     get { return myCollection; } 
     set 
     { 
      if (myCollection != value) 
      { 
       myCollection = value; 
       OnPropertyChanged("MyCollection"); 
      } 
     } 
    } 
    private ObservableCollection<object> myCollection = new ObservableCollection<object>(); 

    public void LoadData() 
    { 
     //execute load method, the assign result to MyCollection 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 
+0

Est-ce juste une question de changer le GetDocumentsQuery() de IEnumerable <> en ObservableCollection <> ?? Ou est-ce plus impliqué que cela? – GPB

+0

Je voudrais vous voir XAML et viewModel pour pouvoir y répondre.Votre grille de données doit avoir une ItemsSource liée à une ObservableCollection <> sur votre viewModel. Lorsque vous récupérez les données à partir de GetDocumentsQuery(), vous devez l'affecter à ObservableCollection sur votre viewModel. Cela a-t-il du sens? – JSprang

+0

Voir les modifications pour répondre pour voir un exemple simple. – JSprang

0

Votre problème peut être lié à LoadBehavior par défaut pour la méthode Load() de contexte de domaine. Essayez de définir explicitement LoadBehaviour sur LoadBehaviour.RefreshCurrent. Pour plus sur LoadBehaviour s'il vous plaît voir: http://msdn.microsoft.com/en-us/library/system.servicemodel.domainservices.client.loadbehavior(v=VS.91).aspx. Parfois, par exemple après une suppression, vous devez également effacer() EntityContainer sur le contexte de domaine ou atleast Clear() l'EntitySet particulier <> pour l'entité que vous essayez de charger, pour les entités correctes être affichée. .

comme, MyDomainContext.EntityContainer.GetEntitySet() Clear();

Questions connexes