RIA, Silverlight 4, EntityStates и сложные типы - PullRequest
1 голос
/ 14 декабря 2009

У меня есть приложение 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.

Я попытался реализовать свойство с именем 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 Ответ

1 голос
/ 14 декабря 2009

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