一旦ObservableCollection被更新,Datagrid中的项目就不会在所有客户端上更新

时间:2011-01-25 11:54:18

标签: c# silverlight entity-framework-4 ria observablecollection

我正在使用SL4,MVVM Toolkit,Entity Framework 4&amp; WCF RIA服务。我有一个DataSource为ObservableCollection<Ticket>的网格。 Ticket OC由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;
    }

当我向OC添加新的Ticket对象时,网格会在我刷新网格后显示所有客户端上的新项目(每30秒我通过调用LoadTickets()为每个客户端刷新网格)。如果我也从网格中删除一个项目,这也可以。但是,当我更新Ticket对象中的属性并保存它(在DataContext上调用SubmitChanges())时,即使刷新网格后,此更改也不会显示在其他客户端上。我必须在浏览器中刷新整个页面才能看到更改。我在这里读过很多类似的问题,他们都说你必须在你的对象属性和ObservableCollection上实现INotifyPropertyChanged。

但是,AFAIK实体框架会自动执行此操作!我可以在Model Designer.cs中看到我的所有属性,并且在设置属性时它们都会引发PropertyChanged事件。我只是想知道这是否与我使用RIA服务的事实有关?我尝试将我的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 :(得分:0)

好的 - 我深究了这一点。在Load()事件中,我需要设置LoadBehaviour

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

这解决了我的问题。