2009-12-14 68 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; 
     } 
    }