Элементы в Datagrid не обновляются на всех клиентах после обновления ObservableCollection - PullRequest
0 голосов
/ 25 января 2011

Я использую SL4, MVVM Toolkit, Entity Framework 4 и WCF RIA Services.У меня есть сетка, чей источник данных ObservableCollection<Ticket>.OC Ticket заполняется службой RIA:

private void LoadTickets()
    {
        IsBusy = true;
        _Context.Load(_Context.GetOpenTicketsForUserQuery(Session.UserId), GetTicketsCallback, null);
    }

    private void GetTicketsCallback(LoadOperation<Ticket> lo)
    {
        ListOfTickets = (ObservableCollection<Ticket>)lo.Entities;
    }

Когда я добавляю новый объект Ticket в OC, сетка отображает новый элемент на всех клиентах после обновления сетки (каждые 30 секунд я обновляюсетка для каждого клиента по телефону LoadTickets()).Это работает, если я удаляю элемент из сетки.Однако, когда я обновляю свойство в объекте Ticket и сохраняю его (вызываю SubmitChanges () для DataContext), это изменение НЕ отображается на других клиентах даже после обновления сетки.Я должен обновить всю страницу в браузере, чтобы увидеть изменения.Я прочитал много подобных вопросов здесь, и все они говорят, что вы должны реализовать INotifyPropertyChanged в свойствах вашего объекта, а также в ObservableCollection.

Но AFAIK Entity Framework делает это автоматически!?Я вижу все свои свойства в Model Designer.cs, и все они вызывают событие PropertyChanged, когда свойство установлено.Мне просто интересно, это как-то связано с тем, что я использую RIA Services?Я попытался добавить свойство из моего объекта Ticket в мои метаданные службы RIA и вызвать событие RaisePropertyChanged (), но оно тоже не сработало.

[MetadataTypeAttribute(typeof(TicketMetadata))]
public partial class Ticket
{
    internal sealed class TicketMetadata : NotifiableObject
    {
        [Required]
        [StringLength(255, MinimumLength=15)]
        public string TicketSummary
        {
            get { return TicketSummary; }
            set
            {
                TicketSummary = value;
                RaisePropertyChanged("TicketSummary");
            }
        }
    }
}

Может кто-нибудь пролить свет на это для меня?Это сводит меня с ума!!Я новичок в Silverlight Development, поэтому извиняюсь, если это глупый вопрос :)

1 Ответ

0 голосов
/ 28 января 2011

Хорошо, я дошел до сути.В событии Load () мне нужно установить LoadBehaviour

_Context.Load(_Context.GetOpenTicketsForUserQuery(Session.UserId), LoadBehavior.MergeIntoCurrent, GetTicketsCallback, null);

Это решило мою проблему.

...