我正在使用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的新手,如果这是一个愚蠢的问题,请道歉:)
答案 0 :(得分:0)
好的 - 我深究了这一点。在Load()事件中,我需要设置LoadBehaviour
_Context.Load(_Context.GetOpenTicketsForUserQuery(Session.UserId), LoadBehavior.MergeIntoCurrent, GetTicketsCallback, null);
这解决了我的问题。