2009-12-14 58 views
1

我有一个复杂数据类型的RIA silverlight 4应用程序作为模型。作为一个熟悉的例子,我们称之为aspnet_User,它有一个名为aspnet_Membership的成员对象; aspnet_User有一个名为“UserName”的成员,而aspnet_Membership有一个名为“Email”的成员。现在使用aspnet_User作为数据上下文,我想绑定到aspnet_User或附加的aspnet_Membership中的任何更改 - 即我想要显示aspnet_User是否“脏”。脏标志应显示是否更改aspnet_User.UserName或aspnet_Membership.Email。现在我已经实现了一个Converter,并绑定到一个对象上的EntityState,这对于显示简单属性是否脏,但是在编辑aspnet_Membership成员的方面时不会改变EntityState来说是很好的。RIA,Silverlight 4,EntityStates和复杂类型

我试图实现一个名为BubbledEntityState的属性,它反映了修改后的aspnet_User或aspnet_membership上的EntityState。它是在Silverlight项目的一个部分类中定义的。这需要对aspnet_User或其成员aspnet_Membership上的EntityState PropertyChanged事件作出反应。所以我试图在部分OnCreated方法中处理这些事件。然而奇怪的是,这根本没有被调用。下面是方法: 公共部分类aspnet_User {

partial void OnCreated() 
    { 
     this.aspnet_Membership.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_Membership_PropertyChanged); 
     this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_User_PropertyChanged); 
    } 

... }

我假定aspnet_User对象构造在服务器上,而不是“重建”当他们重新组建了RIA完成WCF调用后的客户端。这让我感到奇怪。我在做一些胡思乱想的事情吗?任何人都有更好的方式来处理这个问题?

回答

1

好的我有这个工作。它似乎有点复杂,但不是使用OnCreated部分方法,我已经超载了OnLoaded方法:

protected override void OnLoaded(bool isInitialLoad) 
     { 
      base.OnLoaded(isInitialLoad); 
      this.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(aspnet_User_PropertyChanged); 
     } 

    partial void OnCreated() 
    { 

    } 

    void aspnet_User_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "aspnet_Membership") 
     { 
      if (this.aspnet_Membership != null) 
      { 
       this.aspnet_Membership.PropertyChanged+=new System.ComponentModel.PropertyChangedEventHandler(aspnet_Membership_PropertyChanged); 
      } 
     } 
     if (e.PropertyName == "EntityState") 
      this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("BubbledEntityState")); 
    } 

    void aspnet_Membership_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "EntityState") 
      this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("BubbledEntityState")); 
    } 

    public EntityState BubbledEntityState 
    { 
     get 
     { 
      if (this.EntityState== System.Windows.Ria.EntityState.Unmodified) 
      { 
       if (this.aspnet_Membership==null) 
        return System.Windows.Ria.EntityState.Unmodified; 
       if (this.aspnet_Membership.EntityState== System.Windows.Ria.EntityState.Modified) 
        return System.Windows.Ria.EntityState.Modified; 
       return System.Windows.Ria.EntityState.Unmodified; 
      } 
      return this.EntityState; 
     } 
    }