2009-12-14 3 views
1

У меня есть приложение RIA silverlight 4 со сложным типом данных в качестве модели. В качестве знакомого примера назовем его aspnet_User, который имеет объект-член, называемый aspnet_Membership; У aspnet_User есть член, называемый «UserName», а aspnet_Membership - член, называемый «Email». Теперь, используя aspnet_User как datacontext, я хочу привязываться к любым изменениям в aspnet_User или присоединенном aspnet_Membership - то есть я хочу показать, является ли aspnet_User «грязным». Грязный флаг должен показать, если я изменил aspnet_User.UserName или aspnet_Membership.Email. Теперь ранее я реализовал конвертер и привязался к EntityState для объекта, и это прекрасно для того, чтобы показать, являются ли простые свойства грязными, но EntityState не изменяется, когда изменяются аспекты члена aspnet_Membership.RIA, Silverlight 4, EntityStates и сложные типы

Я попытался реализовать свойство BubbledEntityState, которое отражает измененный EntityState либо aspnet_User, либо aspnet_membership. Он определен в частичном классе в проекте Silverlight. Это нужно отреагировать на события EntityState PropertyChanged на aspnet_User или на членство aspnet_Membership. Поэтому я попытался обработать эти события в частичном методе 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

OK У меня это работает. Это все еще кажется немного запутанным, но вместо использования метода OnCreated partial я перегрузил метод 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; 
     } 
    } 
Смежные вопросы