I new to silverlight and trying to make a business application using the mvvm pattern and ria services. I have a view model class that contains a PagedCollectoinView and it is set to the item source of a datagrid. When I update the PagedCollectionView the datagrid is only updated the first time then after that subsequent changes to the data to not reflect in the view until after another edit. Things seem to be delayed one edit.
Below is a summarized example of my xaml and code behind.
This is the code for my view model
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
}
Here is the basics of my 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>
And here is my code behind
public Customers()
{
InitializeComponent();
BusyDialogIndicator.IsBusy = true;
Loaded += new RoutedEventHandler(Customers_Loaded);
CustomerDetails.BeginningEdit += new EventHandler(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();
}
}
}