RIA,Silverlight 4,EntityStates和复杂类型

时间:2009-12-14 13:43:06

标签: silverlight-4.0 ria

我有一个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,这对于显示简单属性是否是脏的但是在编辑aspnet_Membership成员的方面时不改变EntityState很好。

我试图实现一个名为BubbledEntityState的属性,该属性反映了aspnet_User或aspnet_membership上修改过的EntityState。它在Silverlight项目的部分类中定义。这需要对aspnet_User上的EntityState PropertyChanged事件或它的成员aspnet_Membership做出反应。所以我试图在部分OnCreated方法中处理这些事件。然而奇怪的是,根本没有被召唤。这是方法:  public partial class 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 个答案:

答案 0 :(得分: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;
        }
    }