2010-09-04 16 views
0

Je suis nouveau sur silverlight et essaye de faire une application d'entreprise en utilisant le modèle mvvm et les services ria. J'ai une classe de modèle de vue qui contient un PagedCollectoinView et il est défini à la source d'élément d'un DataGrid. Lorsque je mets à jour PagedCollectionView, la grille de données est mise à jour uniquement la première fois, puis après les modifications ultérieures apportées aux données pour ne pas refléter dans la vue avant une autre modification. Les choses semblent être retardées d'un edit.Afficher lié à la vue de collection paginée ne pas mettre à jour tout le temps

Voici un exemple résumant mon code xaml et mon code.

C'est le code de mon point de vue modèle

public class CustomerContactLinks : INotifyPropertyChanged 
{ 
    private ObservableCollection<CustomerContactLink> _CustomerContact; 
    public ObservableCollection<CustomerContactLink> CustomerContact 
    { 
     get 
     { 
      if (_CustomerContact == null) 
       _CustomerContact = new ObservableCollection<CustomerContactLink>(); 
      return _CustomerContact; 
     } 
     set 
     { 
      _CustomerContact = value; 
     } 
    } 

    private PagedCollectionView _CustomerContactPaged; 
    public PagedCollectionView CustomerContactPaged 
    { 
     get 
     { 
      if (_CustomerContactPaged == null) 
       _CustomerContactPaged = new PagedCollectionView(CustomerContact); 
      return _CustomerContactPaged; 
     } 
    } 

    private TicketSystemDataContext _ctx; 
    public TicketSystemDataContext ctx 
    { 
     get 
     { 
      if (_ctx == null) 
       _ctx = new TicketSystemDataContext(); 
      return _ctx; 
     } 
    } 

    public void GetAll() 
    { 
     ctx.Load(ctx.GetCustomerContactInfoQuery(), LoadCustomerContactsComplete, null); 
    } 

    private void LoadCustomerContactsComplete(LoadOperation<CustomerContactLink> lo) 
    { 
     foreach (var entity in lo.Entities) 
     { 
      CustomerContact.Add(entity as CustomerContactLink); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    #endregion 
} 

Voici les bases de mon XAML

 <Data:DataGrid x:Name="GridCustomers" MinHeight="100" MaxWidth="1000" IsReadOnly="True" AutoGenerateColumns="False"> 
        <Data:DataGrid.Columns> 
         <Data:DataGridTextColumn Header="First Name" Binding="{Binding Customer.FirstName}" Width="105" /> 
         <Data:DataGridTextColumn Header="MI" Binding="{Binding Customer.MiddleName}" Width="35" /> 
         <Data:DataGridTextColumn Header="Last Name" Binding="{Binding Customer.LastName}" Width="105"/> 
         <Data:DataGridTextColumn Header="Address1" Binding="{Binding Contact.Address1}" Width="130"/> 
         <Data:DataGridTextColumn Header="Address2" Binding="{Binding Contact.Address2}" Width="130"/> 
         <Data:DataGridTextColumn Header="City" Binding="{Binding Contact.City}" Width="110"/> 
         <Data:DataGridTextColumn Header="State" Binding="{Binding Contact.State}" Width="50"/> 
         <Data:DataGridTextColumn Header="Zip" Binding="{Binding Contact.Zip}" Width="45"/> 
         <Data:DataGridTextColumn Header="Home" Binding="{Binding Contact.PhoneHome}" Width="85"/> 
         <Data:DataGridTextColumn Header="Cell" Binding="{Binding Contact.PhoneCell}" Width="85"/> 
         <Data:DataGridTextColumn Header="Email" Binding="{Binding Contact.Email}" Width="118"/> 
         </Data:DataGrid.Columns> 
       </Data:DataGrid> 

<DataForm:DataForm x:Name="CustomerDetails" Header="Customer Details" AutoGenerateFields="False" AutoEdit="False" AutoCommit="False" 
            CommandButtonsVisibility="Edit" 
            Width="1000" Margin="0,5,0,0"> 

        <DataForm:DataForm.EditTemplate> 

        </DataForm:DataForm.EditTemplate> 

       </DataForm:DataForm> 

Et voici mon code derrière

public Customers() 
    { 
     InitializeComponent(); 
     BusyDialogIndicator.IsBusy = true; 
     Loaded += new RoutedEventHandler(Customers_Loaded); 
     CustomerDetails.BeginningEdit += new EventHandler<System.ComponentModel.CancelEventArgs>(CustomerDetails_BeginningEdit); 
    } 

    void CustomerDetails_BeginningEdit(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     CustomerContacts.CustomerContactPaged.EditItem(CustomerDetails.CurrentItem); 
    } 

    private void Customers_Loaded(object sender, RoutedEventArgs e) 
    { 
     CustomerContacts = new CustomerContactLinks(); 
     CustomerContacts.GetAll(); 
     GridCustomers.ItemsSource = CustomerContacts.CustomerContactPaged; 
     GridCustomerPager.Source = CustomerContacts.CustomerContactPaged; 
     GridCustomers.SelectionChanged += new SelectionChangedEventHandler(GridCustomers_SelectionChanged); 
     BusyDialogIndicator.IsBusy = false; 
    } 


    void GridCustomers_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     CustomerDetails.CurrentItem = GridCustomers.SelectedItem as CustomerContactLink; 
    } 


    private void SaveChanges_Click(object sender, RoutedEventArgs e) 
    { 
     if (WebContext.Current.User.IsAuthenticated) 
     { 
      bool commited = CustomerDetails.CommitEdit(); 
      if (commited && (!CustomerDetails.IsItemChanged && CustomerDetails.IsItemValid)) 
      { 
       CustomerContacts.Update(CustomerDetails.CurrentItem as CustomerContactLink); 
       CustomerContacts.ctx.SubmitChanges(); 
       CustomerContacts.CustomerContactPaged.CommitEdit(); 
       CustomerContacts.CustomerContactPaged.Refresh();  
       (GridCustomers.ItemsSource as PagedCollectionView).Refresh(); 
      } 
     } 
    } 

Répondre

0

Vous devez définir Mode = TwoWay dans la liaison XAML

+0

J'ai essayé et j'ai toujours le même symptôme – Thomas

+0

Est-ce que CustomerContactLink hérite de INotifyPropertyChanges et déclenche-t-il un événement lorsque l'une des propriétés change? – AlexEzh

+0

CustomerContactLink est un ensemble d'entités à partir du code généré. – Thomas